summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--docs/docs.html81
-rw-r--r--docs/docs.txt79
-rw-r--r--docs/parse_log.txt2035
-rw-r--r--dragon/args.rb17
-rw-r--r--dragon/console.rb12
-rw-r--r--dragon/framerate.rb7
-rw-r--r--dragon/recording.rb260
-rw-r--r--dragon/tweetcart.rb102
-rw-r--r--samples/04_physics_and_collisions/06_box_collision_3/app/main.rb4
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/app/block.rb42
-rw-r--r--samples/07_advanced_rendering/11_render_target_noclear/app/main.rb47
-rw-r--r--samples/07_advanced_rendering/11_render_target_noclear/metadata/game_metadata.txt5
-rw-r--r--samples/10_advanced_debugging/03_unit_tests/serialize_deserialize_tests.rb18
-rw-r--r--samples/12_c_extensions/README.md28
-rw-r--r--samples/99_genre_teenytiny/app/main.rb162
-rw-r--r--samples/99_genre_teenytiny/license.txt9
-rw-r--r--samples/99_genre_teenytiny/metadata/game_metadata.txt6
-rw-r--r--samples/99_genre_teenytiny/metadata/icon.pngbin0 -> 157056 bytes
-rw-r--r--samples/99_genre_teenytiny/sprites/square-green.pngbin0 -> 283 bytes
-rw-r--r--samples/99_genre_teenytiny/sprites/square-red.pngbin0 -> 274 bytes
20 files changed, 2820 insertions, 94 deletions
diff --git a/docs/docs.html b/docs/docs.html
index 5ad5d6c..6967368 100644
--- a/docs/docs.html
+++ b/docs/docs.html
@@ -2,7 +2,7 @@
<head>
<meta charset="utf-8">
<title>DragonRuby Game Toolkit Documentation</title>
- <link href="docs.css?ver=1628311142" rel="stylesheet" type="text/css" media="all">
+ <link href="docs.css?ver=1629947615" rel="stylesheet" type="text/css" media="all">
</head>
<body>
<div id='toc'>
@@ -52,7 +52,7 @@
<li><a class='header-1' href='#--docs---geometry-'>DOCS: <code>Geometry</code></a></li>
<li><a class='header-1' href='#--docs---gtk--geometry#scale_rect-'>DOCS: <code>GTK::Geometry#scale_rect</code></a></li>
<li><a class='header-1' href='#--source-code'>Source Code</a></li>
-<ul><li><a class='header-2' href='#---samples'>Samples</a></li></ul><ul><ul><li><a class='header-3' href='#----learn-ruby-optional---beginner-ruby-primer---automation-rb'>Learn Ruby Optional - Beginner Ruby Primer - automation.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----learn-ruby-optional---beginner-ruby-primer---main-rb'>Learn Ruby Optional - Beginner Ruby Primer - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----learn-ruby-optional---intermediate-ruby-primer---printing-txt'>Learn Ruby Optional - Intermediate Ruby Primer - printing.txt</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----learn-ruby-optional---intermediate-ruby-primer---strings-txt'>Learn Ruby Optional - Intermediate Ruby Primer - strings.txt</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----learn-ruby-optional---intermediate-ruby-primer---numbers-txt'>Learn Ruby Optional - Intermediate Ruby Primer - numbers.txt</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----learn-ruby-optional---intermediate-ruby-primer---booleans-txt'>Learn Ruby Optional - Intermediate Ruby Primer - booleans.txt</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----learn-ruby-optional---intermediate-ruby-primer---conditionals-txt'>Learn Ruby Optional - Intermediate Ruby Primer - conditionals.txt</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----learn-ruby-optional---intermediate-ruby-primer---looping-txt'>Learn Ruby Optional - Intermediate Ruby Primer - looping.txt</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----learn-ruby-optional---intermediate-ruby-primer---functions-txt'>Learn Ruby Optional - Intermediate Ruby Primer - functions.txt</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----learn-ruby-optional---intermediate-ruby-primer---arrays-txt'>Learn Ruby Optional - Intermediate Ruby Primer - arrays.txt</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----learn-ruby-optional---intermediate-ruby-primer---main-rb'>Learn Ruby Optional - Intermediate Ruby Primer - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rendering-basics---labels---main-rb'>Rendering Basics - Labels - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rendering-basics---lines---main-rb'>Rendering Basics - Lines - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rendering-basics---solids-borders---main-rb'>Rendering Basics - Solids Borders - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rendering-basics---sprites---main-rb'>Rendering Basics - Sprites - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rendering-basics---sounds---main-rb'>Rendering Basics - Sounds - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----input-basics---keyboard---main-rb'>Input Basics - Keyboard - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----input-basics---moving-a-sprite---main-rb'>Input Basics - Moving A Sprite - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----input-basics---mouse---main-rb'>Input Basics - Mouse - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----input-basics---mouse-point-to-rect---main-rb'>Input Basics - Mouse Point To Rect - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----input-basics---mouse-rect-to-rect---main-rb'>Input Basics - Mouse Rect To Rect - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----input-basics---controller---main-rb'>Input Basics - Controller - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----input-basics---touch---main-rb'>Input Basics - Touch - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rendering-sprites---animation-using-separate-pngs---main-rb'>Rendering Sprites - Animation Using Separate Pngs - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rendering-sprites---animation-using-sprite-sheet---main-rb'>Rendering Sprites - Animation Using Sprite Sheet - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rendering-sprites---animation-states---main-rb'>Rendering Sprites - Animation States - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rendering-sprites---color-and-rotation---main-rb'>Rendering Sprites - Color And Rotation - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---simple---main-rb'>Physics And Collisions - Simple - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---moving-objects---main-rb'>Physics And Collisions - Moving Objects - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---entities---main-rb'>Physics And Collisions - Entities - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---box-collision---main-rb'>Physics And Collisions - Box Collision - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---box-collision-2---main-rb'>Physics And Collisions - Box Collision 2 - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---box-collision-3---main-rb'>Physics And Collisions - Box Collision 3 - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---jump-physics---main-rb'>Physics And Collisions - Jump Physics - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---bouncing-on-collision---ball-rb'>Physics And Collisions - Bouncing On Collision - ball.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---bouncing-on-collision---block-rb'>Physics And Collisions - Bouncing On Collision - block.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---bouncing-on-collision---cannon-rb'>Physics And Collisions - Bouncing On Collision - cannon.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---bouncing-on-collision---main-rb'>Physics And Collisions - Bouncing On Collision - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---bouncing-on-collision---peg-rb'>Physics And Collisions - Bouncing On Collision - peg.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---bouncing-on-collision---vector2d-rb'>Physics And Collisions - Bouncing On Collision - vector2d.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---arbitrary-collision---ball-rb'>Physics And Collisions - Arbitrary Collision - ball.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---arbitrary-collision---blocks-rb'>Physics And Collisions - Arbitrary Collision - blocks.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---arbitrary-collision---linear_collider-rb'>Physics And Collisions - Arbitrary Collision - linear_collider.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---arbitrary-collision---main-rb'>Physics And Collisions - Arbitrary Collision - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---arbitrary-collision---paddle-rb'>Physics And Collisions - Arbitrary Collision - paddle.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---arbitrary-collision---rectangle-rb'>Physics And Collisions - Arbitrary Collision - rectangle.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---arbitrary-collision---square_collider-rb'>Physics And Collisions - Arbitrary Collision - square_collider.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---arbitrary-collision---vector2d-rb'>Physics And Collisions - Arbitrary Collision - vector2d.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---collision-with-object-removal---ball-rb'>Physics And Collisions - Collision With Object Removal - ball.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---collision-with-object-removal---linear_collider-rb'>Physics And Collisions - Collision With Object Removal - linear_collider.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---collision-with-object-removal---main-rb'>Physics And Collisions - Collision With Object Removal - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---collision-with-object-removal---paddle-rb'>Physics And Collisions - Collision With Object Removal - paddle.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---collision-with-object-removal---tests-rb'>Physics And Collisions - Collision With Object Removal - tests.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---collision-with-object-removal---vector2d-rb'>Physics And Collisions - Collision With Object Removal - vector2d.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----mouse---mouse-click---main-rb'>Mouse - Mouse Click - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----mouse---mouse-move---main-rb'>Mouse - Mouse Move - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----mouse---mouse-move-paint-app---main-rb'>Mouse - Mouse Move Paint App - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----mouse---coordinate-systems---main-rb'>Mouse - Coordinate Systems - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----save-load---save-load-game---main-rb'>Save Load - Save Load Game - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-audio---audio-mixer---main-rb'>Advanced Audio - Audio Mixer - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-audio---audio-mixer---server_ip_address-txt'>Advanced Audio - Audio Mixer - server_ip_address.txt</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-audio---audio-mixer---metadata---ios_metadata-txt'>Advanced Audio - Audio Mixer - Metadata - ios_metadata.txt</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-audio---sound-synthesis---main-rb'>Advanced Audio - Sound Synthesis - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-rendering---simple-render-targets---main-rb'>Advanced Rendering - Simple Render Targets - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-rendering---render-targets-with-tile-manipulation---main-rb'>Advanced Rendering - Render Targets With Tile Manipulation - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-rendering---render-target-viewports---main-rb'>Advanced Rendering - Render Target Viewports - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-rendering---render-primitive-hierarchies---main-rb'>Advanced Rendering - Render Primitive Hierarchies - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-rendering---render-primitives-as-hash---main-rb'>Advanced Rendering - Render Primitives As Hash - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-rendering---pixel-arrays---main-rb'>Advanced Rendering - Pixel Arrays - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-rendering---simple-camera---main-rb'>Advanced Rendering - Simple Camera - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-rendering---splitscreen-camera---main-rb'>Advanced Rendering - Splitscreen Camera - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-rendering---z-targeting-camera---main-rb'>Advanced Rendering - Z Targeting Camera - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-rendering---blend-modes---main-rb'>Advanced Rendering - Blend Modes - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----tweening-lerping-easing-functions---easing-functions---main-rb'>Tweening Lerping Easing Functions - Easing Functions - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----tweening-lerping-easing-functions---cubic-bezier---main-rb'>Tweening Lerping Easing Functions - Cubic Bezier - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----tweening-lerping-easing-functions---easing-using-spline---main-rb'>Tweening Lerping Easing Functions - Easing Using Spline - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----tweening-lerping-easing-functions---parametric-enemy-movement---main-rb'>Tweening Lerping Easing Functions - Parametric Enemy Movement - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----performance---sprites-as-hash---main-rb'>Performance - Sprites As Hash - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----performance---sprites-as-entities---main-rb'>Performance - Sprites As Entities - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----performance---sprites-as-strict-entities---main-rb'>Performance - Sprites As Strict Entities - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----performance---sprites-as-classes---main-rb'>Performance - Sprites As Classes - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----performance---static-sprites-as-classes---main-rb'>Performance - Static Sprites As Classes - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----performance---static-sprites-as-classes-with-custom-drawing---main-rb'>Performance - Static Sprites As Classes With Custom Drawing - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----performance---collision-limits---main-rb'>Performance - Collision Limits - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-debugging---trace-debugging---main-rb'>Advanced Debugging - Trace Debugging - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-debugging---trace-debugging-classes---main-rb'>Advanced Debugging - Trace Debugging Classes - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-debugging---unit-tests---benchmark_api_tests-rb'>Advanced Debugging - Unit Tests - benchmark_api_tests.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-debugging---unit-tests---exception_raising_tests-rb'>Advanced Debugging - Unit Tests - exception_raising_tests.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-debugging---unit-tests---fn_tests-rb'>Advanced Debugging - Unit Tests - fn_tests.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-debugging---unit-tests---gen_docs-rb'>Advanced Debugging - Unit Tests - gen_docs.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-debugging---unit-tests---geometry_tests-rb'>Advanced Debugging - Unit Tests - geometry_tests.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-debugging---unit-tests---http_tests-rb'>Advanced Debugging - Unit Tests - http_tests.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-debugging---unit-tests---nil_coercion_tests-rb'>Advanced Debugging - Unit Tests - nil_coercion_tests.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-debugging---unit-tests---object_to_primitive_tests-rb'>Advanced Debugging - Unit Tests - object_to_primitive_tests.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-debugging---unit-tests---parsing_tests-rb'>Advanced Debugging - Unit Tests - parsing_tests.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-debugging---unit-tests---pretty_format_tests-rb'>Advanced Debugging - Unit Tests - pretty_format_tests.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-debugging---unit-tests---require_tests-rb'>Advanced Debugging - Unit Tests - require_tests.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-debugging---unit-tests---serialize_deserialize_tests-rb'>Advanced Debugging - Unit Tests - serialize_deserialize_tests.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-debugging---unit-tests---state_serialization_experimental_tests-rb'>Advanced Debugging - Unit Tests - state_serialization_experimental_tests.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-debugging---unit-tests---suggest_autocompletion_tests-rb'>Advanced Debugging - Unit Tests - suggest_autocompletion_tests.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----http---retrieve-images---main-rb'>Http - Retrieve Images - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----http---web-server---main-rb'>Http - Web Server - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----c-extensions---basics---main-rb'>C Extensions - Basics - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----c-extensions---intermediate---main-rb'>C Extensions - Intermediate - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----c-extensions---native-pixel-arrays---main-rb'>C Extensions - Native Pixel Arrays - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----path-finding-algorithms---breadth-first-search---main-rb'>Path Finding Algorithms - Breadth First Search - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----path-finding-algorithms---detailed-breadth-first-search---main-rb'>Path Finding Algorithms - Detailed Breadth First Search - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----path-finding-algorithms---breadcrumbs---main-rb'>Path Finding Algorithms - Breadcrumbs - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----path-finding-algorithms---early-exit---main-rb'>Path Finding Algorithms - Early Exit - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----path-finding-algorithms---dijkstra---main-rb'>Path Finding Algorithms - Dijkstra - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----path-finding-algorithms---heuristic---main-rb'>Path Finding Algorithms - Heuristic - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----path-finding-algorithms---heuristic-with-walls---main-rb'>Path Finding Algorithms - Heuristic With Walls - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----path-finding-algorithms---a-star---main-rb'>Path Finding Algorithms - A Star - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----path-finding-algorithms---tower-defense---main-rb'>Path Finding Algorithms - Tower Defense - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----3d---3d-cube---main-rb'>3d - 3d Cube - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----3d---wireframe---main-rb'>3d - Wireframe - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----3d---wireframe---data---what-is-this-txt'>3d - Wireframe - Data - what-is-this.txt</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----arcade---bullet-hell---main-rb'>Arcade - Bullet Hell - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----arcade---dueling-starships---main-rb'>Arcade - Dueling Starships - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----arcade/flappy-dragon/credits-txt'>arcade/flappy dragon/credits.txt</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----arcade/flappy-dragon/main-rb'>arcade/flappy dragon/main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----arcade---pong---main-rb'>Arcade - Pong - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----arcade---snakemoji---main-rb'>Arcade - Snakemoji - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----arcade---solar-system---main-rb'>Arcade - Solar System - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----arcade---sound-golf---main-rb'>Arcade - Sound Golf - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----arcade---twinstick---main-rb'>Arcade - Twinstick - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----crafting---craft-game-starting-point---main-rb'>Crafting - Craft Game Starting Point - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----crafting---farming-game-starting-point---main-rb'>Crafting - Farming Game Starting Point - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----crafting---farming-game-starting-point---repl-rb'>Crafting - Farming Game Starting Point - repl.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----crafting---farming-game-starting-point---tests-rb'>Crafting - Farming Game Starting Point - tests.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----dev-tools---add-buttons-to-console---main-rb'>Dev Tools - Add Buttons To Console - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----dev-tools---animation-creator-starting-point---main-rb'>Dev Tools - Animation Creator Starting Point - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----dev-tools---tile-editor-starting-point---main-rb'>Dev Tools - Tile Editor Starting Point - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----dungeon-crawl---classics-jam---main-rb'>Dungeon Crawl - Classics Jam - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----fighting---special-move-inputs---main-rb'>Fighting - Special Move Inputs - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----lowrez---nokia-3310---main-rb'>Lowrez - Nokia 3310 - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----lowrez---nokia-3310---nokia-rb'>Lowrez - Nokia 3310 - nokia.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----lowrez---resolution-64x64---lowrez-rb'>Lowrez - Resolution 64x64 - lowrez.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----lowrez---resolution-64x64---main-rb'>Lowrez - Resolution 64x64 - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----platformer---clepto-frog---main-rb'>Platformer - Clepto Frog - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----platformer---clepto-frog---map-rb'>Platformer - Clepto Frog - map.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----platformer---gorillas-basic---credits-txt'>Platformer - Gorillas Basic - credits.txt</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----platformer---gorillas-basic---main-rb'>Platformer - Gorillas Basic - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----platformer---gorillas-basic---tests-rb'>Platformer - Gorillas Basic - tests.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----platformer---gorillas-basic---tests---building_generation_tests-rb'>Platformer - Gorillas Basic - Tests - building_generation_tests.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----platformer---the-little-probe---main-rb'>Platformer - The Little Probe - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----platformer---the-little-probe---data---level-txt'>Platformer - The Little Probe - Data - level.txt</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----platformer---the-little-probe---data---level_lava-txt'>Platformer - The Little Probe - Data - level_lava.txt</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-narrative---choose-your-own-adventure---decision-rb'>Rpg Narrative - Choose Your Own Adventure - decision.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-narrative---choose-your-own-adventure---main-rb'>Rpg Narrative - Choose Your Own Adventure - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-narrative---return-of-serenity---lowrez_simulator-rb'>Rpg Narrative - Return Of Serenity - lowrez_simulator.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-narrative---return-of-serenity---main-rb'>Rpg Narrative - Return Of Serenity - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-narrative---return-of-serenity---require-rb'>Rpg Narrative - Return Of Serenity - require.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-narrative---return-of-serenity---storyline-rb'>Rpg Narrative - Return Of Serenity - storyline.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-narrative---return-of-serenity---storyline_anka-rb'>Rpg Narrative - Return Of Serenity - storyline_anka.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-narrative---return-of-serenity---storyline_blinking_light-rb'>Rpg Narrative - Return Of Serenity - storyline_blinking_light.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-narrative---return-of-serenity---storyline_day_one-rb'>Rpg Narrative - Return Of Serenity - storyline_day_one.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-narrative---return-of-serenity---storyline_final_decision-rb'>Rpg Narrative - Return Of Serenity - storyline_final_decision.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-narrative---return-of-serenity---storyline_final_message-rb'>Rpg Narrative - Return Of Serenity - storyline_final_message.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-narrative---return-of-serenity---storyline_serenity_alive-rb'>Rpg Narrative - Return Of Serenity - storyline_serenity_alive.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-narrative---return-of-serenity---storyline_serenity_bio-rb'>Rpg Narrative - Return Of Serenity - storyline_serenity_bio.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-narrative---return-of-serenity---storyline_serenity_introduction-rb'>Rpg Narrative - Return Of Serenity - storyline_serenity_introduction.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-narrative---return-of-serenity---storyline_speed_of_light-rb'>Rpg Narrative - Return Of Serenity - storyline_speed_of_light.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-roguelike---roguelike-starting-point---constants-rb'>Rpg Roguelike - Roguelike Starting Point - constants.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-roguelike---roguelike-starting-point---legend-rb'>Rpg Roguelike - Roguelike Starting Point - legend.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-roguelike---roguelike-starting-point---main-rb'>Rpg Roguelike - Roguelike Starting Point - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-roguelike---roguelike-starting-point---sprite_lookup-rb'>Rpg Roguelike - Roguelike Starting Point - sprite_lookup.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-roguelike---roguelike-line-of-sight---main-rb'>Rpg Roguelike - Roguelike Line Of Sight - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-tactical---hexagonal-grid---main-rb'>Rpg Tactical - Hexagonal Grid - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-tactical---isometric-grid---main-rb'>Rpg Tactical - Isometric Grid - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-topdown---topdown-starting-point---main-rb'>Rpg Topdown - Topdown Starting Point - main.rb</a></li></ul></ul><ul><li><a class='header-2' href='#---oss'>OSS</a></li></ul><ul><ul><li><a class='header-3' href='#----args-rb'>args.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----assert-rb'>assert.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----attr_gtk-rb'>attr_gtk.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----attr_sprite-rb'>attr_sprite.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----console-rb'>console.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----console_color-rb'>console_color.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----console_font_style-rb'>console_font_style.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----console_menu-rb'>console_menu.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----console_prompt-rb'>console_prompt.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----controller-rb'>controller.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----controller/config-rb'>controller/config.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----controller/keys-rb'>controller/keys.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----directional_input_helper_methods-rb'>directional_input_helper_methods.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----easing-rb'>easing.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----entity-rb'>entity.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----geometry-rb'>geometry.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----grid-rb'>grid.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----inputs-rb'>inputs.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----ios_wizard-rb'>ios_wizard.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----itch_wizard-rb'>itch_wizard.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----layout-rb'>layout.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----log-rb'>log.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----metadata-rb'>metadata.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----numeric-rb'>numeric.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----remote_hotload_client-rb'>remote_hotload_client.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----runtime/autocomplete-rb'>runtime/autocomplete.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----runtime/benchmark-rb'>runtime/benchmark.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----runtime/draw-rb'>runtime/draw.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----runtime/framerate-rb'>runtime/framerate.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----runtime/framerate_diagnostics-rb'>runtime/framerate_diagnostics.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----runtime/hotload-rb'>runtime/hotload.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----string-rb'>string.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----tests-rb'>tests.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----trace-rb'>trace.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----wizards-rb'>wizards.rb</a></li></ul></ul></ul> </div>
+<ul><li><a class='header-2' href='#---samples'>Samples</a></li></ul><ul><ul><li><a class='header-3' href='#----learn-ruby-optional---beginner-ruby-primer---automation-rb'>Learn Ruby Optional - Beginner Ruby Primer - automation.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----learn-ruby-optional---beginner-ruby-primer---main-rb'>Learn Ruby Optional - Beginner Ruby Primer - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----learn-ruby-optional---intermediate-ruby-primer---printing-txt'>Learn Ruby Optional - Intermediate Ruby Primer - printing.txt</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----learn-ruby-optional---intermediate-ruby-primer---strings-txt'>Learn Ruby Optional - Intermediate Ruby Primer - strings.txt</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----learn-ruby-optional---intermediate-ruby-primer---numbers-txt'>Learn Ruby Optional - Intermediate Ruby Primer - numbers.txt</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----learn-ruby-optional---intermediate-ruby-primer---booleans-txt'>Learn Ruby Optional - Intermediate Ruby Primer - booleans.txt</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----learn-ruby-optional---intermediate-ruby-primer---conditionals-txt'>Learn Ruby Optional - Intermediate Ruby Primer - conditionals.txt</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----learn-ruby-optional---intermediate-ruby-primer---looping-txt'>Learn Ruby Optional - Intermediate Ruby Primer - looping.txt</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----learn-ruby-optional---intermediate-ruby-primer---functions-txt'>Learn Ruby Optional - Intermediate Ruby Primer - functions.txt</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----learn-ruby-optional---intermediate-ruby-primer---arrays-txt'>Learn Ruby Optional - Intermediate Ruby Primer - arrays.txt</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----learn-ruby-optional---intermediate-ruby-primer---main-rb'>Learn Ruby Optional - Intermediate Ruby Primer - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rendering-basics---labels---main-rb'>Rendering Basics - Labels - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rendering-basics---lines---main-rb'>Rendering Basics - Lines - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rendering-basics---solids-borders---main-rb'>Rendering Basics - Solids Borders - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rendering-basics---sprites---main-rb'>Rendering Basics - Sprites - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rendering-basics---sounds---main-rb'>Rendering Basics - Sounds - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----input-basics---keyboard---main-rb'>Input Basics - Keyboard - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----input-basics---moving-a-sprite---main-rb'>Input Basics - Moving A Sprite - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----input-basics---mouse---main-rb'>Input Basics - Mouse - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----input-basics---mouse-point-to-rect---main-rb'>Input Basics - Mouse Point To Rect - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----input-basics---mouse-rect-to-rect---main-rb'>Input Basics - Mouse Rect To Rect - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----input-basics---controller---main-rb'>Input Basics - Controller - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----input-basics---touch---main-rb'>Input Basics - Touch - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rendering-sprites---animation-using-separate-pngs---main-rb'>Rendering Sprites - Animation Using Separate Pngs - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rendering-sprites---animation-using-sprite-sheet---main-rb'>Rendering Sprites - Animation Using Sprite Sheet - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rendering-sprites---animation-states---main-rb'>Rendering Sprites - Animation States - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rendering-sprites---color-and-rotation---main-rb'>Rendering Sprites - Color And Rotation - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---simple---main-rb'>Physics And Collisions - Simple - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---moving-objects---main-rb'>Physics And Collisions - Moving Objects - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---entities---main-rb'>Physics And Collisions - Entities - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---box-collision---main-rb'>Physics And Collisions - Box Collision - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---box-collision-2---main-rb'>Physics And Collisions - Box Collision 2 - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---box-collision-3---main-rb'>Physics And Collisions - Box Collision 3 - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---jump-physics---main-rb'>Physics And Collisions - Jump Physics - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---bouncing-on-collision---ball-rb'>Physics And Collisions - Bouncing On Collision - ball.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---bouncing-on-collision---block-rb'>Physics And Collisions - Bouncing On Collision - block.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---bouncing-on-collision---cannon-rb'>Physics And Collisions - Bouncing On Collision - cannon.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---bouncing-on-collision---main-rb'>Physics And Collisions - Bouncing On Collision - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---bouncing-on-collision---peg-rb'>Physics And Collisions - Bouncing On Collision - peg.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---bouncing-on-collision---vector2d-rb'>Physics And Collisions - Bouncing On Collision - vector2d.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---arbitrary-collision---ball-rb'>Physics And Collisions - Arbitrary Collision - ball.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---arbitrary-collision---blocks-rb'>Physics And Collisions - Arbitrary Collision - blocks.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---arbitrary-collision---linear_collider-rb'>Physics And Collisions - Arbitrary Collision - linear_collider.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---arbitrary-collision---main-rb'>Physics And Collisions - Arbitrary Collision - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---arbitrary-collision---paddle-rb'>Physics And Collisions - Arbitrary Collision - paddle.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---arbitrary-collision---rectangle-rb'>Physics And Collisions - Arbitrary Collision - rectangle.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---arbitrary-collision---square_collider-rb'>Physics And Collisions - Arbitrary Collision - square_collider.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---arbitrary-collision---vector2d-rb'>Physics And Collisions - Arbitrary Collision - vector2d.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---collision-with-object-removal---ball-rb'>Physics And Collisions - Collision With Object Removal - ball.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---collision-with-object-removal---linear_collider-rb'>Physics And Collisions - Collision With Object Removal - linear_collider.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---collision-with-object-removal---main-rb'>Physics And Collisions - Collision With Object Removal - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---collision-with-object-removal---paddle-rb'>Physics And Collisions - Collision With Object Removal - paddle.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---collision-with-object-removal---tests-rb'>Physics And Collisions - Collision With Object Removal - tests.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----physics-and-collisions---collision-with-object-removal---vector2d-rb'>Physics And Collisions - Collision With Object Removal - vector2d.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----mouse---mouse-click---main-rb'>Mouse - Mouse Click - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----mouse---mouse-move---main-rb'>Mouse - Mouse Move - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----mouse---mouse-move-paint-app---main-rb'>Mouse - Mouse Move Paint App - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----mouse---coordinate-systems---main-rb'>Mouse - Coordinate Systems - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----save-load---save-load-game---main-rb'>Save Load - Save Load Game - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-audio---audio-mixer---main-rb'>Advanced Audio - Audio Mixer - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-audio---audio-mixer---server_ip_address-txt'>Advanced Audio - Audio Mixer - server_ip_address.txt</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-audio---audio-mixer---metadata---ios_metadata-txt'>Advanced Audio - Audio Mixer - Metadata - ios_metadata.txt</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-audio---sound-synthesis---main-rb'>Advanced Audio - Sound Synthesis - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-rendering---simple-render-targets---main-rb'>Advanced Rendering - Simple Render Targets - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-rendering---render-targets-with-tile-manipulation---main-rb'>Advanced Rendering - Render Targets With Tile Manipulation - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-rendering---render-target-viewports---main-rb'>Advanced Rendering - Render Target Viewports - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-rendering---render-primitive-hierarchies---main-rb'>Advanced Rendering - Render Primitive Hierarchies - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-rendering---render-primitives-as-hash---main-rb'>Advanced Rendering - Render Primitives As Hash - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-rendering---pixel-arrays---main-rb'>Advanced Rendering - Pixel Arrays - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-rendering---simple-camera---main-rb'>Advanced Rendering - Simple Camera - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-rendering---splitscreen-camera---main-rb'>Advanced Rendering - Splitscreen Camera - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-rendering---z-targeting-camera---main-rb'>Advanced Rendering - Z Targeting Camera - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-rendering---blend-modes---main-rb'>Advanced Rendering - Blend Modes - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-rendering---render-target-noclear---main-rb'>Advanced Rendering - Render Target Noclear - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----tweening-lerping-easing-functions---easing-functions---main-rb'>Tweening Lerping Easing Functions - Easing Functions - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----tweening-lerping-easing-functions---cubic-bezier---main-rb'>Tweening Lerping Easing Functions - Cubic Bezier - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----tweening-lerping-easing-functions---easing-using-spline---main-rb'>Tweening Lerping Easing Functions - Easing Using Spline - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----tweening-lerping-easing-functions---parametric-enemy-movement---main-rb'>Tweening Lerping Easing Functions - Parametric Enemy Movement - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----performance---sprites-as-hash---main-rb'>Performance - Sprites As Hash - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----performance---sprites-as-entities---main-rb'>Performance - Sprites As Entities - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----performance---sprites-as-strict-entities---main-rb'>Performance - Sprites As Strict Entities - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----performance---sprites-as-classes---main-rb'>Performance - Sprites As Classes - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----performance---static-sprites-as-classes---main-rb'>Performance - Static Sprites As Classes - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----performance---static-sprites-as-classes-with-custom-drawing---main-rb'>Performance - Static Sprites As Classes With Custom Drawing - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----performance---collision-limits---main-rb'>Performance - Collision Limits - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-debugging---trace-debugging---main-rb'>Advanced Debugging - Trace Debugging - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-debugging---trace-debugging-classes---main-rb'>Advanced Debugging - Trace Debugging Classes - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-debugging---unit-tests---benchmark_api_tests-rb'>Advanced Debugging - Unit Tests - benchmark_api_tests.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-debugging---unit-tests---exception_raising_tests-rb'>Advanced Debugging - Unit Tests - exception_raising_tests.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-debugging---unit-tests---fn_tests-rb'>Advanced Debugging - Unit Tests - fn_tests.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-debugging---unit-tests---gen_docs-rb'>Advanced Debugging - Unit Tests - gen_docs.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-debugging---unit-tests---geometry_tests-rb'>Advanced Debugging - Unit Tests - geometry_tests.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-debugging---unit-tests---http_tests-rb'>Advanced Debugging - Unit Tests - http_tests.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-debugging---unit-tests---nil_coercion_tests-rb'>Advanced Debugging - Unit Tests - nil_coercion_tests.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-debugging---unit-tests---object_to_primitive_tests-rb'>Advanced Debugging - Unit Tests - object_to_primitive_tests.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-debugging---unit-tests---parsing_tests-rb'>Advanced Debugging - Unit Tests - parsing_tests.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-debugging---unit-tests---pretty_format_tests-rb'>Advanced Debugging - Unit Tests - pretty_format_tests.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-debugging---unit-tests---require_tests-rb'>Advanced Debugging - Unit Tests - require_tests.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-debugging---unit-tests---serialize_deserialize_tests-rb'>Advanced Debugging - Unit Tests - serialize_deserialize_tests.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-debugging---unit-tests---state_serialization_experimental_tests-rb'>Advanced Debugging - Unit Tests - state_serialization_experimental_tests.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----advanced-debugging---unit-tests---suggest_autocompletion_tests-rb'>Advanced Debugging - Unit Tests - suggest_autocompletion_tests.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----http---retrieve-images---main-rb'>Http - Retrieve Images - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----http---web-server---main-rb'>Http - Web Server - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----c-extensions---basics---main-rb'>C Extensions - Basics - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----c-extensions---intermediate---main-rb'>C Extensions - Intermediate - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----c-extensions---native-pixel-arrays---main-rb'>C Extensions - Native Pixel Arrays - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----path-finding-algorithms---breadth-first-search---main-rb'>Path Finding Algorithms - Breadth First Search - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----path-finding-algorithms---detailed-breadth-first-search---main-rb'>Path Finding Algorithms - Detailed Breadth First Search - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----path-finding-algorithms---breadcrumbs---main-rb'>Path Finding Algorithms - Breadcrumbs - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----path-finding-algorithms---early-exit---main-rb'>Path Finding Algorithms - Early Exit - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----path-finding-algorithms---dijkstra---main-rb'>Path Finding Algorithms - Dijkstra - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----path-finding-algorithms---heuristic---main-rb'>Path Finding Algorithms - Heuristic - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----path-finding-algorithms---heuristic-with-walls---main-rb'>Path Finding Algorithms - Heuristic With Walls - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----path-finding-algorithms---a-star---main-rb'>Path Finding Algorithms - A Star - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----path-finding-algorithms---tower-defense---main-rb'>Path Finding Algorithms - Tower Defense - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----3d---3d-cube---main-rb'>3d - 3d Cube - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----3d---wireframe---main-rb'>3d - Wireframe - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----3d---wireframe---data---what-is-this-txt'>3d - Wireframe - Data - what-is-this.txt</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----arcade---bullet-hell---main-rb'>Arcade - Bullet Hell - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----arcade---dueling-starships---main-rb'>Arcade - Dueling Starships - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----arcade/flappy-dragon/credits-txt'>arcade/flappy dragon/credits.txt</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----arcade/flappy-dragon/main-rb'>arcade/flappy dragon/main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----arcade---pong---main-rb'>Arcade - Pong - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----arcade---snakemoji---main-rb'>Arcade - Snakemoji - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----arcade---solar-system---main-rb'>Arcade - Solar System - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----arcade---sound-golf---main-rb'>Arcade - Sound Golf - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----arcade---twinstick---main-rb'>Arcade - Twinstick - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----crafting---craft-game-starting-point---main-rb'>Crafting - Craft Game Starting Point - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----crafting---farming-game-starting-point---main-rb'>Crafting - Farming Game Starting Point - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----crafting---farming-game-starting-point---repl-rb'>Crafting - Farming Game Starting Point - repl.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----crafting---farming-game-starting-point---tests-rb'>Crafting - Farming Game Starting Point - tests.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----dev-tools---add-buttons-to-console---main-rb'>Dev Tools - Add Buttons To Console - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----dev-tools---animation-creator-starting-point---main-rb'>Dev Tools - Animation Creator Starting Point - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----dev-tools---tile-editor-starting-point---main-rb'>Dev Tools - Tile Editor Starting Point - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----dungeon-crawl---classics-jam---main-rb'>Dungeon Crawl - Classics Jam - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----fighting---special-move-inputs---main-rb'>Fighting - Special Move Inputs - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----lowrez---nokia-3310---main-rb'>Lowrez - Nokia 3310 - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----lowrez---nokia-3310---nokia-rb'>Lowrez - Nokia 3310 - nokia.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----lowrez---resolution-64x64---lowrez-rb'>Lowrez - Resolution 64x64 - lowrez.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----lowrez---resolution-64x64---main-rb'>Lowrez - Resolution 64x64 - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----platformer---clepto-frog---main-rb'>Platformer - Clepto Frog - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----platformer---clepto-frog---map-rb'>Platformer - Clepto Frog - map.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----platformer---gorillas-basic---credits-txt'>Platformer - Gorillas Basic - credits.txt</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----platformer---gorillas-basic---main-rb'>Platformer - Gorillas Basic - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----platformer---gorillas-basic---tests-rb'>Platformer - Gorillas Basic - tests.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----platformer---gorillas-basic---tests---building_generation_tests-rb'>Platformer - Gorillas Basic - Tests - building_generation_tests.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----platformer---the-little-probe---main-rb'>Platformer - The Little Probe - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----platformer---the-little-probe---data---level-txt'>Platformer - The Little Probe - Data - level.txt</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----platformer---the-little-probe---data---level_lava-txt'>Platformer - The Little Probe - Data - level_lava.txt</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-narrative---choose-your-own-adventure---decision-rb'>Rpg Narrative - Choose Your Own Adventure - decision.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-narrative---choose-your-own-adventure---main-rb'>Rpg Narrative - Choose Your Own Adventure - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-narrative---return-of-serenity---lowrez_simulator-rb'>Rpg Narrative - Return Of Serenity - lowrez_simulator.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-narrative---return-of-serenity---main-rb'>Rpg Narrative - Return Of Serenity - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-narrative---return-of-serenity---require-rb'>Rpg Narrative - Return Of Serenity - require.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-narrative---return-of-serenity---storyline-rb'>Rpg Narrative - Return Of Serenity - storyline.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-narrative---return-of-serenity---storyline_anka-rb'>Rpg Narrative - Return Of Serenity - storyline_anka.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-narrative---return-of-serenity---storyline_blinking_light-rb'>Rpg Narrative - Return Of Serenity - storyline_blinking_light.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-narrative---return-of-serenity---storyline_day_one-rb'>Rpg Narrative - Return Of Serenity - storyline_day_one.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-narrative---return-of-serenity---storyline_final_decision-rb'>Rpg Narrative - Return Of Serenity - storyline_final_decision.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-narrative---return-of-serenity---storyline_final_message-rb'>Rpg Narrative - Return Of Serenity - storyline_final_message.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-narrative---return-of-serenity---storyline_serenity_alive-rb'>Rpg Narrative - Return Of Serenity - storyline_serenity_alive.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-narrative---return-of-serenity---storyline_serenity_bio-rb'>Rpg Narrative - Return Of Serenity - storyline_serenity_bio.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-narrative---return-of-serenity---storyline_serenity_introduction-rb'>Rpg Narrative - Return Of Serenity - storyline_serenity_introduction.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-narrative---return-of-serenity---storyline_speed_of_light-rb'>Rpg Narrative - Return Of Serenity - storyline_speed_of_light.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-roguelike---roguelike-starting-point---constants-rb'>Rpg Roguelike - Roguelike Starting Point - constants.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-roguelike---roguelike-starting-point---legend-rb'>Rpg Roguelike - Roguelike Starting Point - legend.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-roguelike---roguelike-starting-point---main-rb'>Rpg Roguelike - Roguelike Starting Point - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-roguelike---roguelike-starting-point---sprite_lookup-rb'>Rpg Roguelike - Roguelike Starting Point - sprite_lookup.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-roguelike---roguelike-line-of-sight---main-rb'>Rpg Roguelike - Roguelike Line Of Sight - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-tactical---hexagonal-grid---main-rb'>Rpg Tactical - Hexagonal Grid - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-tactical---isometric-grid---main-rb'>Rpg Tactical - Isometric Grid - main.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----rpg-topdown---topdown-starting-point---main-rb'>Rpg Topdown - Topdown Starting Point - main.rb</a></li></ul></ul><ul><li><a class='header-2' href='#---oss'>OSS</a></li></ul><ul><ul><li><a class='header-3' href='#----args-rb'>args.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----assert-rb'>assert.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----attr_gtk-rb'>attr_gtk.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----attr_sprite-rb'>attr_sprite.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----console-rb'>console.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----console_color-rb'>console_color.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----console_font_style-rb'>console_font_style.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----console_menu-rb'>console_menu.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----console_prompt-rb'>console_prompt.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----controller-rb'>controller.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----controller/config-rb'>controller/config.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----controller/keys-rb'>controller/keys.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----directional_input_helper_methods-rb'>directional_input_helper_methods.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----easing-rb'>easing.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----entity-rb'>entity.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----geometry-rb'>geometry.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----grid-rb'>grid.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----inputs-rb'>inputs.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----ios_wizard-rb'>ios_wizard.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----itch_wizard-rb'>itch_wizard.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----layout-rb'>layout.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----log-rb'>log.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----metadata-rb'>metadata.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----numeric-rb'>numeric.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----remote_hotload_client-rb'>remote_hotload_client.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----runtime/autocomplete-rb'>runtime/autocomplete.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----runtime/benchmark-rb'>runtime/benchmark.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----runtime/draw-rb'>runtime/draw.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----runtime/framerate-rb'>runtime/framerate.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----runtime/framerate_diagnostics-rb'>runtime/framerate_diagnostics.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----runtime/hotload-rb'>runtime/hotload.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----string-rb'>string.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----tests-rb'>tests.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----trace-rb'>trace.rb</a></li></ul></ul><ul><ul><li><a class='header-3' href='#----wizards-rb'>wizards.rb</a></li></ul></ul></ul> </div>
<div id='content'>
<h1 id='--dragonruby-game-toolkit-live-docs'>DragonRuby Game Toolkit Live Docs</h1>
<p>
@@ -6736,7 +6736,7 @@ class Game
def calc_below
return unless player.dy <= 0
- tiles_below = find_tiles { |t| t.rect.top <= player.y }
+ tiles_below = find_tiles { |t| t.rect.top <= player.prev_rect.y }
collision = find_colliding_tile tiles_below, (player.rect.merge y: player.next_rect.y)
return unless collision
if collision.neighbors.b == :none && player.jumped_down_at.elapsed_time < 10
@@ -6767,7 +6767,7 @@ class Game
def calc_above
return unless player.dy > 0
- tiles_above = find_tiles { |t| t.rect.y >= player.y }
+ tiles_above = find_tiles { |t| t.rect.y >= player.prev_rect.y }
collision = find_colliding_tile tiles_above, (player.rect.merge y: player.next_rect.y)
return unless collision
return if collision.neighbors.t == :none
@@ -13610,6 +13610,57 @@ def tick args
end
</code></pre>
+<h3 id='----advanced-rendering---render-target-noclear---main-rb'>Advanced Rendering - Render Target Noclear - main.rb</h3>
+<pre><code class="language-ruby"># ./samples/07_advanced_rendering/11_render_target_noclear/app/main.rb
+def tick args
+ args.state.x ||= 500
+ args.state.y ||= 350
+ args.state.xinc ||= 7
+ args.state.yinc ||= 7
+ args.state.bgcolor ||= 1
+ args.state.bginc ||= 1
+
+ # clear the render target on the first tick, and then never again. Draw
+ # another box to it every tick, accumulating over time.
+ clear_target = (args.state.tick_count == 0) || (args.inputs.keyboard.key_down.space)
+ args.render_target(:accumulation).background_color = [ 0, 0, 0, 0 ];
+ args.render_target(:accumulation).clear_before_render = clear_target
+ args.render_target(:accumulation).solids << [args.state.x, args.state.y, 25, 25, 255, 0, 0, 255];
+ args.state.x += args.state.xinc
+ args.state.y += args.state.yinc
+ args.state.bgcolor += args.state.bginc
+
+ # animation upkeep...change where we draw the next box and what color the
+ # window background will be.
+ if args.state.xinc > 0 && args.state.x >= 1280
+ args.state.xinc = -7
+ elsif args.state.xinc < 0 && args.state.x < 0
+ args.state.xinc = 7
+ end
+
+ if args.state.yinc > 0 && args.state.y >= 720
+ args.state.yinc = -7
+ elsif args.state.yinc < 0 && args.state.y < 0
+ args.state.yinc = 7
+ end
+
+ if args.state.bginc > 0 && args.state.bgcolor >= 255
+ args.state.bginc = -1
+ elsif args.state.bginc < 0 && args.state.bgcolor <= 0
+ args.state.bginc = 1
+ end
+
+ # clear the screen to a shade of blue and draw the render target, which
+ # is not clearing every frame, on top of it. Note that you can NOT opt to
+ # skip clearing the screen, only render targets. The screen clears every
+ # frame; double-buffering would prevent correct updates between frames.
+ args.outputs.background_color = [ 0, 0, args.state.bgcolor, 255 ]
+ args.outputs.sprites << [ 0, 0, 1280, 720, :accumulation ]
+end
+
+$gtk.reset
+
+</code></pre>
<h3 id='----tweening-lerping-easing-functions---easing-functions---main-rb'>Tweening Lerping Easing Functions - Easing Functions - main.rb</h3>
<pre><code class="language-ruby"># ./samples/08_tweening_lerping_easing_functions/01_easing_functions/app/main.rb
def tick args
@@ -37215,6 +37266,7 @@ end
</code></pre>
<h3 id='----attr_sprite-rb'>attr_sprite.rb</h3>
<pre><code class="language-ruby"># ./dragon/attr_sprite.rb
+# coding: utf-8
# Copyright 2019 DragonRuby LLC
# MIT License
# attr_sprite.rb has been released under MIT (*only this file*).
@@ -37276,6 +37328,7 @@ end
</code></pre>
<h3 id='----console-rb'>console.rb</h3>
<pre><code class="language-ruby"># ./dragon/console.rb
+# coding: utf-8
# Copyright 2019 DragonRuby LLC
# MIT License
# console.rb has been released under MIT (*only this file*).
@@ -38089,6 +38142,7 @@ end
</code></pre>
<h3 id='----console_color-rb'>console_color.rb</h3>
<pre><code class="language-ruby"># ./dragon/console_color.rb
+# coding: utf-8
# Copyright 2019 DragonRuby LLC
# MIT License
# console_color.rb has been released under MIT (*only this file*).
@@ -38127,6 +38181,7 @@ end
</code></pre>
<h3 id='----console_font_style-rb'>console_font_style.rb</h3>
<pre><code class="language-ruby"># ./dragon/console_font_style.rb
+# coding: utf-8
# Copyright 2019 DragonRuby LLC
# MIT License
# console_font_style.rb has been released under MIT (*only this file*).
@@ -38171,6 +38226,7 @@ end
</code></pre>
<h3 id='----console_menu-rb'>console_menu.rb</h3>
<pre><code class="language-ruby"># ./dragon/console_menu.rb
+# coding: utf-8
# Copyright 2019 DragonRuby LLC
# MIT License
# console_menu.rb has been released under MIT (*only this file*).
@@ -38335,6 +38391,7 @@ end
</code></pre>
<h3 id='----console_prompt-rb'>console_prompt.rb</h3>
<pre><code class="language-ruby"># ./dragon/console_prompt.rb
+# coding: utf-8
# Copyright 2019 DragonRuby LLC
# MIT License
# console_prompt.rb has been released under MIT (*only this file*).
@@ -40962,11 +41019,13 @@ end
</code></pre>
<h3 id='----ios_wizard-rb'>ios_wizard.rb</h3>
<pre><code class="language-ruby"># ./dragon/ios_wizard.rb
-# Contributors outside of DragonRuby who also hold Copyright: Michał Dudziński
+# coding: utf-8
# Copyright 2019 DragonRuby LLC
# MIT License
# ios_wizard.rb has been released under MIT (*only this file*).
+# Contributors outside of DragonRuby who also hold Copyright: Michał Dudziński
+
class IOSWizard < Wizard
def initialize
@doctor_executed_at = 0
@@ -42073,6 +42132,7 @@ end
</code></pre>
<h3 id='----itch_wizard-rb'>itch_wizard.rb</h3>
<pre><code class="language-ruby"># ./dragon/itch_wizard.rb
+# coding: utf-8
# Copyright 2019 DragonRuby LLC
# MIT License
# itch_wizard.rb has been released under MIT (*only this file*).
@@ -42333,6 +42393,7 @@ end
</code></pre>
<h3 id='----layout-rb'>layout.rb</h3>
<pre><code class="language-ruby"># ./dragon/layout.rb
+# coding: utf-8
# Copyright 2019 DragonRuby LLC
# MIT License
# layout.rb has been released under MIT (*only this file*).
@@ -43252,11 +43313,13 @@ end
</code></pre>
<h3 id='----metadata-rb'>metadata.rb</h3>
<pre><code class="language-ruby"># ./dragon/metadata.rb
-# Contributors outside of DragonRuby who also hold Copyright: Michał Dudziński
+# coding: utf-8
# Copyright 2021 DragonRuby LLC
# MIT License
# metadata.rb has been released under MIT (*only this file*).
+# Contributors outside of DragonRuby who also hold Copyright: Michał Dudziński
+
module Metadata
def metadata_file_path
"metadata/game_metadata.txt"
@@ -44316,6 +44379,7 @@ end
</code></pre>
<h3 id='----runtime/autocomplete-rb'>runtime/autocomplete.rb</h3>
<pre><code class="language-ruby"># ./dragon/runtime/autocomplete.rb
+# coding: utf-8
# Copyright 2019 DragonRuby LLC
# MIT License
# autocomplete.rb has been released under MIT (*only this file*).
@@ -44470,6 +44534,7 @@ end # end GTK
</code></pre>
<h3 id='----runtime/benchmark-rb'>runtime/benchmark.rb</h3>
<pre><code class="language-ruby"># ./dragon/runtime/benchmark.rb
+# coding: utf-8
# Copyright 2019 DragonRuby LLC
# MIT License
# benchmark.rb has been released under MIT (*only this file*).
@@ -44585,6 +44650,7 @@ end
</code></pre>
<h3 id='----runtime/draw-rb'>runtime/draw.rb</h3>
<pre><code class="language-ruby"># ./dragon/runtime/draw.rb
+# coding: utf-8
# Copyright 2019 DragonRuby LLC
# MIT License
# draw.rb has been released under MIT (*only this file*).
@@ -44748,6 +44814,7 @@ end
</code></pre>
<h3 id='----runtime/framerate-rb'>runtime/framerate.rb</h3>
<pre><code class="language-ruby"># ./dragon/runtime/framerate.rb
+# coding: utf-8
# Copyright 2019 DragonRuby LLC
# MIT License
# framerate.rb has been released under MIT (*only this file*).
@@ -44835,6 +44902,7 @@ end # end module GTK
</code></pre>
<h3 id='----runtime/framerate_diagnostics-rb'>runtime/framerate_diagnostics.rb</h3>
<pre><code class="language-ruby"># ./dragon/runtime/framerate_diagnostics.rb
+# coding: utf-8
# Copyright 2019 DragonRuby LLC
# MIT License
# framerate_diagnostics.rb has been released under MIT (*only this file*).
@@ -45655,6 +45723,7 @@ end
</code></pre>
<h3 id='----wizards-rb'>wizards.rb</h3>
<pre><code class="language-ruby"># ./dragon/wizards.rb
+# coding: utf-8
# Copyright 2019 DragonRuby LLC
# MIT License
# wizards.rb has been released under MIT (*only this file*).
diff --git a/docs/docs.txt b/docs/docs.txt
index c07fbcd..d6f5def 100644
--- a/docs/docs.txt
+++ b/docs/docs.txt
@@ -6800,7 +6800,7 @@ Follows is a source code listing for all files that have been open sourced. This
def calc_below
return unless player.dy <= 0
- tiles_below = find_tiles { |t| t.rect.top <= player.y }
+ tiles_below = find_tiles { |t| t.rect.top <= player.prev_rect.y }
collision = find_colliding_tile tiles_below, (player.rect.merge y: player.next_rect.y)
return unless collision
if collision.neighbors.b == :none && player.jumped_down_at.elapsed_time < 10
@@ -6831,7 +6831,7 @@ Follows is a source code listing for all files that have been open sourced. This
def calc_above
return unless player.dy > 0
- tiles_above = find_tiles { |t| t.rect.y >= player.y }
+ tiles_above = find_tiles { |t| t.rect.y >= player.prev_rect.y }
collision = find_colliding_tile tiles_above, (player.rect.merge y: player.next_rect.y)
return unless collision
return if collision.neighbors.t == :none
@@ -13755,6 +13755,59 @@ Follows is a source code listing for all files that have been open sourced. This
#+end_src
+*** Advanced Rendering - Render Target Noclear - main.rb
+#+begin_src ruby
+ # ./samples/07_advanced_rendering/11_render_target_noclear/app/main.rb
+ def tick args
+ args.state.x ||= 500
+ args.state.y ||= 350
+ args.state.xinc ||= 7
+ args.state.yinc ||= 7
+ args.state.bgcolor ||= 1
+ args.state.bginc ||= 1
+
+ # clear the render target on the first tick, and then never again. Draw
+ # another box to it every tick, accumulating over time.
+ clear_target = (args.state.tick_count == 0) || (args.inputs.keyboard.key_down.space)
+ args.render_target(:accumulation).background_color = [ 0, 0, 0, 0 ];
+ args.render_target(:accumulation).clear_before_render = clear_target
+ args.render_target(:accumulation).solids << [args.state.x, args.state.y, 25, 25, 255, 0, 0, 255];
+ args.state.x += args.state.xinc
+ args.state.y += args.state.yinc
+ args.state.bgcolor += args.state.bginc
+
+ # animation upkeep...change where we draw the next box and what color the
+ # window background will be.
+ if args.state.xinc > 0 && args.state.x >= 1280
+ args.state.xinc = -7
+ elsif args.state.xinc < 0 && args.state.x < 0
+ args.state.xinc = 7
+ end
+
+ if args.state.yinc > 0 && args.state.y >= 720
+ args.state.yinc = -7
+ elsif args.state.yinc < 0 && args.state.y < 0
+ args.state.yinc = 7
+ end
+
+ if args.state.bginc > 0 && args.state.bgcolor >= 255
+ args.state.bginc = -1
+ elsif args.state.bginc < 0 && args.state.bgcolor <= 0
+ args.state.bginc = 1
+ end
+
+ # clear the screen to a shade of blue and draw the render target, which
+ # is not clearing every frame, on top of it. Note that you can NOT opt to
+ # skip clearing the screen, only render targets. The screen clears every
+ # frame; double-buffering would prevent correct updates between frames.
+ args.outputs.background_color = [ 0, 0, args.state.bgcolor, 255 ]
+ args.outputs.sprites << [ 0, 0, 1280, 720, :accumulation ]
+ end
+
+ $gtk.reset
+
+#+end_src
+
*** Tweening Lerping Easing Functions - Easing Functions - main.rb
#+begin_src ruby
# ./samples/08_tweening_lerping_easing_functions/01_easing_functions/app/main.rb
@@ -37561,6 +37614,7 @@ Follows is a source code listing for all files that have been open sourced. This
*** attr_sprite.rb
#+begin_src ruby
# ./dragon/attr_sprite.rb
+ # coding: utf-8
# Copyright 2019 DragonRuby LLC
# MIT License
# attr_sprite.rb has been released under MIT (*only this file*).
@@ -37624,6 +37678,7 @@ Follows is a source code listing for all files that have been open sourced. This
*** console.rb
#+begin_src ruby
# ./dragon/console.rb
+ # coding: utf-8
# Copyright 2019 DragonRuby LLC
# MIT License
# console.rb has been released under MIT (*only this file*).
@@ -38439,6 +38494,7 @@ Follows is a source code listing for all files that have been open sourced. This
*** console_color.rb
#+begin_src ruby
# ./dragon/console_color.rb
+ # coding: utf-8
# Copyright 2019 DragonRuby LLC
# MIT License
# console_color.rb has been released under MIT (*only this file*).
@@ -38479,6 +38535,7 @@ Follows is a source code listing for all files that have been open sourced. This
*** console_font_style.rb
#+begin_src ruby
# ./dragon/console_font_style.rb
+ # coding: utf-8
# Copyright 2019 DragonRuby LLC
# MIT License
# console_font_style.rb has been released under MIT (*only this file*).
@@ -38525,6 +38582,7 @@ Follows is a source code listing for all files that have been open sourced. This
*** console_menu.rb
#+begin_src ruby
# ./dragon/console_menu.rb
+ # coding: utf-8
# Copyright 2019 DragonRuby LLC
# MIT License
# console_menu.rb has been released under MIT (*only this file*).
@@ -38691,6 +38749,7 @@ Follows is a source code listing for all files that have been open sourced. This
*** console_prompt.rb
#+begin_src ruby
# ./dragon/console_prompt.rb
+ # coding: utf-8
# Copyright 2019 DragonRuby LLC
# MIT License
# console_prompt.rb has been released under MIT (*only this file*).
@@ -41338,11 +41397,13 @@ Follows is a source code listing for all files that have been open sourced. This
*** ios_wizard.rb
#+begin_src ruby
# ./dragon/ios_wizard.rb
- # Contributors outside of DragonRuby who also hold Copyright: Michał Dudziński
+ # coding: utf-8
# Copyright 2019 DragonRuby LLC
# MIT License
# ios_wizard.rb has been released under MIT (*only this file*).
+ # Contributors outside of DragonRuby who also hold Copyright: Michał Dudziński
+
class IOSWizard < Wizard
def initialize
@doctor_executed_at = 0
@@ -42451,6 +42512,7 @@ Follows is a source code listing for all files that have been open sourced. This
*** itch_wizard.rb
#+begin_src ruby
# ./dragon/itch_wizard.rb
+ # coding: utf-8
# Copyright 2019 DragonRuby LLC
# MIT License
# itch_wizard.rb has been released under MIT (*only this file*).
@@ -42713,6 +42775,7 @@ Follows is a source code listing for all files that have been open sourced. This
*** layout.rb
#+begin_src ruby
# ./dragon/layout.rb
+ # coding: utf-8
# Copyright 2019 DragonRuby LLC
# MIT License
# layout.rb has been released under MIT (*only this file*).
@@ -43636,11 +43699,13 @@ Follows is a source code listing for all files that have been open sourced. This
*** metadata.rb
#+begin_src ruby
# ./dragon/metadata.rb
- # Contributors outside of DragonRuby who also hold Copyright: Michał Dudziński
+ # coding: utf-8
# Copyright 2021 DragonRuby LLC
# MIT License
# metadata.rb has been released under MIT (*only this file*).
+ # Contributors outside of DragonRuby who also hold Copyright: Michał Dudziński
+
module Metadata
def metadata_file_path
"metadata/game_metadata.txt"
@@ -44706,6 +44771,7 @@ Follows is a source code listing for all files that have been open sourced. This
*** runtime/autocomplete.rb
#+begin_src ruby
# ./dragon/runtime/autocomplete.rb
+ # coding: utf-8
# Copyright 2019 DragonRuby LLC
# MIT License
# autocomplete.rb has been released under MIT (*only this file*).
@@ -44862,6 +44928,7 @@ Follows is a source code listing for all files that have been open sourced. This
*** runtime/benchmark.rb
#+begin_src ruby
# ./dragon/runtime/benchmark.rb
+ # coding: utf-8
# Copyright 2019 DragonRuby LLC
# MIT License
# benchmark.rb has been released under MIT (*only this file*).
@@ -44979,6 +45046,7 @@ Follows is a source code listing for all files that have been open sourced. This
*** runtime/draw.rb
#+begin_src ruby
# ./dragon/runtime/draw.rb
+ # coding: utf-8
# Copyright 2019 DragonRuby LLC
# MIT License
# draw.rb has been released under MIT (*only this file*).
@@ -45144,6 +45212,7 @@ Follows is a source code listing for all files that have been open sourced. This
*** runtime/framerate.rb
#+begin_src ruby
# ./dragon/runtime/framerate.rb
+ # coding: utf-8
# Copyright 2019 DragonRuby LLC
# MIT License
# framerate.rb has been released under MIT (*only this file*).
@@ -45233,6 +45302,7 @@ Follows is a source code listing for all files that have been open sourced. This
*** runtime/framerate_diagnostics.rb
#+begin_src ruby
# ./dragon/runtime/framerate_diagnostics.rb
+ # coding: utf-8
# Copyright 2019 DragonRuby LLC
# MIT License
# framerate_diagnostics.rb has been released under MIT (*only this file*).
@@ -46063,6 +46133,7 @@ Follows is a source code listing for all files that have been open sourced. This
*** wizards.rb
#+begin_src ruby
# ./dragon/wizards.rb
+ # coding: utf-8
# Copyright 2019 DragonRuby LLC
# MIT License
# wizards.rb has been released under MIT (*only this file*).
diff --git a/docs/parse_log.txt b/docs/parse_log.txt
index 4e43983..07e163d 100644
--- a/docs/parse_log.txt
+++ b/docs/parse_log.txt
@@ -25899,10 +25899,10 @@ Follows is a source code listing for all files that have been open sourced. This
- Inside source: true
*** True Line Result
return unless player.dy <= 0
-** Processing line: ~ tiles_below = find_tiles { |t| t.rect.top <= player.y }~
+** Processing line: ~ tiles_below = find_tiles { |t| t.rect.top <= player.prev_rect.y }~
- Inside source: true
*** True Line Result
- tiles_below = find_tiles { |t| t.rect.top <= player.y }
+ tiles_below = find_tiles { |t| t.rect.top <= player.prev_rect.y }
** Processing line: ~ collision = find_colliding_tile tiles_below, (player.rect.merge y: player.next_rect.y)~
- Inside source: true
*** True Line Result
@@ -26023,10 +26023,10 @@ Follows is a source code listing for all files that have been open sourced. This
- Inside source: true
*** True Line Result
return unless player.dy > 0
-** Processing line: ~ tiles_above = find_tiles { |t| t.rect.y >= player.y }~
+** Processing line: ~ tiles_above = find_tiles { |t| t.rect.y >= player.prev_rect.y }~
- Inside source: true
*** True Line Result
- tiles_above = find_tiles { |t| t.rect.y >= player.y }
+ tiles_above = find_tiles { |t| t.rect.y >= player.prev_rect.y }
** Processing line: ~ collision = find_colliding_tile tiles_above, (player.rect.merge y: player.next_rect.y)~
- Inside source: true
*** True Line Result
@@ -53879,6 +53879,222 @@ 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 - Render Target Noclear - main.rb~
+- Header detected.
+*** True Line Result
+
+*** True Line Result
+*** Advanced Rendering - Render Target Noclear - 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/11_render_target_noclear/app/main.rb~
+- Inside source: true
+*** True Line Result
+ # ./samples/07_advanced_rendering/11_render_target_noclear/app/main.rb
+** Processing line: ~ def tick args~
+- Inside source: true
+*** True Line Result
+ def tick args
+** Processing line: ~ args.state.x ||= 500~
+- Inside source: true
+*** True Line Result
+ args.state.x ||= 500
+** Processing line: ~ args.state.y ||= 350~
+- Inside source: true
+*** True Line Result
+ args.state.y ||= 350
+** Processing line: ~ args.state.xinc ||= 7~
+- Inside source: true
+*** True Line Result
+ args.state.xinc ||= 7
+** Processing line: ~ args.state.yinc ||= 7~
+- Inside source: true
+*** True Line Result
+ args.state.yinc ||= 7
+** Processing line: ~ args.state.bgcolor ||= 1~
+- Inside source: true
+*** True Line Result
+ args.state.bgcolor ||= 1
+** Processing line: ~ args.state.bginc ||= 1~
+- Inside source: true
+*** True Line Result
+ args.state.bginc ||= 1
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~ # clear the render target on the first tick, and then never again. Draw~
+- Inside source: true
+*** True Line Result
+ # clear the render target on the first tick, and then never again. Draw
+** Processing line: ~ # another box to it every tick, accumulating over time.~
+- Inside source: true
+*** True Line Result
+ # another box to it every tick, accumulating over time.
+** Processing line: ~ clear_target = (args.state.tick_count == 0) || (args.inputs.keyboard.key_down.space)~
+- Inside source: true
+*** True Line Result
+ clear_target = (args.state.tick_count == 0) || (args.inputs.keyboard.key_down.space)
+** Processing line: ~ args.render_target(:accumulation).background_color = [ 0, 0, 0, 0 ];~
+- Inside source: true
+*** True Line Result
+ args.render_target(:accumulation).background_color = [ 0, 0, 0, 0 ];
+** Processing line: ~ args.render_target(:accumulation).clear_before_render = clear_target~
+- Inside source: true
+*** True Line Result
+ args.render_target(:accumulation).clear_before_render = clear_target
+** Processing line: ~ args.render_target(:accumulation).solids << [args.state.x, args.state.y, 25, 25, 255, 0, 0, 255];~
+- Inside source: true
+*** True Line Result
+ args.render_target(:accumulation).solids << [args.state.x, args.state.y, 25, 25, 255, 0, 0, 255];
+** Processing line: ~ args.state.x += args.state.xinc~
+- Inside source: true
+*** True Line Result
+ args.state.x += args.state.xinc
+** Processing line: ~ args.state.y += args.state.yinc~
+- Inside source: true
+*** True Line Result
+ args.state.y += args.state.yinc
+** Processing line: ~ args.state.bgcolor += args.state.bginc~
+- Inside source: true
+*** True Line Result
+ args.state.bgcolor += args.state.bginc
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~ # animation upkeep...change where we draw the next box and what color the~
+- Inside source: true
+*** True Line Result
+ # animation upkeep...change where we draw the next box and what color the
+** Processing line: ~ # window background will be.~
+- Inside source: true
+*** True Line Result
+ # window background will be.
+** Processing line: ~ if args.state.xinc > 0 && args.state.x >= 1280~
+- Inside source: true
+*** True Line Result
+ if args.state.xinc > 0 && args.state.x >= 1280
+** Processing line: ~ args.state.xinc = -7~
+- Inside source: true
+*** True Line Result
+ args.state.xinc = -7
+** Processing line: ~ elsif args.state.xinc < 0 && args.state.x < 0~
+- Inside source: true
+*** True Line Result
+ elsif args.state.xinc < 0 && args.state.x < 0
+** Processing line: ~ args.state.xinc = 7~
+- Inside source: true
+*** True Line Result
+ args.state.xinc = 7
+** Processing line: ~ end~
+- Inside source: true
+*** True Line Result
+ end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~ if args.state.yinc > 0 && args.state.y >= 720~
+- Inside source: true
+*** True Line Result
+ if args.state.yinc > 0 && args.state.y >= 720
+** Processing line: ~ args.state.yinc = -7~
+- Inside source: true
+*** True Line Result
+ args.state.yinc = -7
+** Processing line: ~ elsif args.state.yinc < 0 && args.state.y < 0~
+- Inside source: true
+*** True Line Result
+ elsif args.state.yinc < 0 && args.state.y < 0
+** Processing line: ~ args.state.yinc = 7~
+- Inside source: true
+*** True Line Result
+ args.state.yinc = 7
+** Processing line: ~ end~
+- Inside source: true
+*** True Line Result
+ end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~ if args.state.bginc > 0 && args.state.bgcolor >= 255~
+- Inside source: true
+*** True Line Result
+ if args.state.bginc > 0 && args.state.bgcolor >= 255
+** Processing line: ~ args.state.bginc = -1~
+- Inside source: true
+*** True Line Result
+ args.state.bginc = -1
+** Processing line: ~ elsif args.state.bginc < 0 && args.state.bgcolor <= 0~
+- Inside source: true
+*** True Line Result
+ elsif args.state.bginc < 0 && args.state.bgcolor <= 0
+** Processing line: ~ args.state.bginc = 1~
+- Inside source: true
+*** True Line Result
+ args.state.bginc = 1
+** Processing line: ~ end~
+- Inside source: true
+*** True Line Result
+ end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~ # clear the screen to a shade of blue and draw the render target, which~
+- Inside source: true
+*** True Line Result
+ # clear the screen to a shade of blue and draw the render target, which
+** Processing line: ~ # is not clearing every frame, on top of it. Note that you can NOT opt to~
+- Inside source: true
+*** True Line Result
+ # is not clearing every frame, on top of it. Note that you can NOT opt to
+** Processing line: ~ # skip clearing the screen, only render targets. The screen clears every~
+- Inside source: true
+*** True Line Result
+ # skip clearing the screen, only render targets. The screen clears every
+** Processing line: ~ # frame; double-buffering would prevent correct updates between frames.~
+- Inside source: true
+*** True Line Result
+ # frame; double-buffering would prevent correct updates between frames.
+** Processing line: ~ args.outputs.background_color = [ 0, 0, args.state.bgcolor, 255 ]~
+- Inside source: true
+*** True Line Result
+ args.outputs.background_color = [ 0, 0, args.state.bgcolor, 255 ]
+** Processing line: ~ args.outputs.sprites << [ 0, 0, 1280, 720, :accumulation ]~
+- Inside source: true
+*** True Line Result
+ args.outputs.sprites << [ 0, 0, 1280, 720, :accumulation ]
+** Processing line: ~ end~
+- Inside source: true
+*** True Line Result
+ end
+** Processing line: ~~
+- 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
+#+end_src
+** Processing line: ~~
+- End of paragraph detected.
+*** True Line Result
+
** Processing line: ~*** Tweening Lerping Easing Functions - Easing Functions - main.rb~
- Header detected.
*** True Line Result
@@ -61159,10 +61375,10 @@ Follows is a source code listing for all files that have been open sourced. This
- Inside source: true
*** True Line Result
result = args.gtk.serialize_state args.state
-** Processing line: ~ assert.equal! result, "{:entity_id=>3, :entity_keys_by_ref=>{}, :tick_count=>-1, :player_one=>\"test\"}"~
+** Processing line: ~ assert.equal! result, "{:entity_id=>4, :entity_keys_by_ref=>{}, :tick_count=>-1, :player_one=>\"test\"}"~
- Inside source: true
*** True Line Result
- 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\"}"
** Processing line: ~~
- Inside source: true
*** True Line Result
@@ -61179,10 +61395,10 @@ Follows is a source code listing for all files that have been open sourced. This
- Inside source: true
*** True Line Result
result = args.gtk.serialize_state 'state.txt', args.state
-** Processing line: ~ assert.equal! result, "{:entity_id=>3, :entity_keys_by_ref=>{}, :tick_count=>-1, :player_one=>\"test\"}"~
+** Processing line: ~ assert.equal! result, "{:entity_id=>4, :entity_keys_by_ref=>{}, :tick_count=>-1, :player_one=>\"test\"}"~
- Inside source: true
*** True Line Result
- 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\"}"
** Processing line: ~ end~
- Inside source: true
*** True Line Result
@@ -61375,10 +61591,10 @@ Follows is a source code listing for all files that have been open sourced. This
- Inside source: true
*** True Line Result
serialized_state = args.gtk.serialize_state args.state
-** Processing line: ~ 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}}'~
+** Processing line: ~ 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}}'~
- Inside source: true
*** True Line Result
- 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}}'
** Processing line: ~~
- Inside source: true
*** True Line Result
@@ -61607,6 +61823,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 test_serialization_excludes_thrash_count args, assert~
+- Inside source: true
+*** True Line Result
+ def test_serialization_excludes_thrash_count args, assert
+** Processing line: ~ GTK::Entity.__reset_id__!~
+- Inside source: true
+*** True Line Result
+ GTK::Entity.__reset_id__!
+** Processing line: ~ args.state.player.name = "Ryu"~
+- Inside source: true
+*** True Line Result
+ args.state.player.name = "Ryu"
+** Processing line: ~ # force a nil pun~
+- Inside source: true
+*** True Line Result
+ # force a nil pun
+** Processing line: ~ if args.state.player.age > 30~
+- Inside source: true
+*** True Line Result
+ if args.state.player.age > 30
+** Processing line: ~ end~
+- Inside source: true
+*** True Line Result
+ end
+** Processing line: ~ assert.equal! args.state.player.as_hash[:__thrash_count__][:>], 1~
+- Inside source: true
+*** True Line Result
+ assert.equal! args.state.player.as_hash[:__thrash_count__][:>], 1
+** Processing line: ~ result = args.gtk.serialize_state args.state~
+- Inside source: true
+*** True Line Result
+ result = args.gtk.serialize_state args.state
+** Processing line: ~ assert.false! (result.include? "__thrash_count__"),~
+- Inside source: true
+*** True Line Result
+ assert.false! (result.include? "__thrash_count__"),
+** Processing line: ~ "The __thrash_count__ key exists in state when it shouldn't have."~
+- Inside source: true
+*** True Line Result
+ "The __thrash_count__ key exists in state when it shouldn't have."
+** 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
@@ -147791,6 +148055,746 @@ Follows is a source code listing for all files that have been open sourced. This
- End of paragraph detected.
*** True Line Result
+** Processing line: ~*** Teentiny - main.rb~
+- Header detected.
+*** True Line Result
+
+*** True Line Result
+*** Teentiny - 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_teentiny/app/main.rb~
+- Inside source: true
+*** True Line Result
+ # ./samples/99_genre_teentiny/app/main.rb
+** Processing line: ~ # full documenation is at http://docs.dragonruby.org~
+- 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~
+- 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~
+- Inside source: true
+*** True Line Result
+ def tick args
+** Processing line: ~ # ====================================================~
+- Inside source: true
+*** True Line Result
+ # ====================================================
+** Processing line: ~ # initialize default variables~
+- Inside source: true
+*** True Line Result
+ # initialize default variables
+** Processing line: ~ # ====================================================~
+- Inside source: true
+*** True Line Result
+ # ====================================================
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~ # ruby has an operator called ||= which means "only initialize this if it's nil"~
+- 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~
+- 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~
+- Inside source: true
+*** True Line Result
+ # set the initial position of the target
+** Processing line: ~ args.state.target ||= { x: args.grid.w.half,~
+- Inside source: true
+*** True Line Result
+ args.state.target ||= { x: args.grid.w.half,
+** Processing line: ~ y: args.grid.h.half,~
+- Inside source: true
+*** True Line Result
+ y: args.grid.h.half,
+** Processing line: ~ w: 20,~
+- Inside source: true
+*** True Line Result
+ w: 20,
+** Processing line: ~ h: 20 }~
+- Inside source: true
+*** True Line Result
+ h: 20 }
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~ # set the initial position of the player~
+- Inside source: true
+*** True Line Result
+ # set the initial position of the player
+** Processing line: ~ args.state.player ||= { x: 50,~
+- Inside source: true
+*** True Line Result
+ args.state.player ||= { x: 50,
+** Processing line: ~ y: 50,~
+- Inside source: true
+*** True Line Result
+ y: 50,
+** Processing line: ~ w: 20,~
+- Inside source: true
+*** True Line Result
+ w: 20,
+** Processing line: ~ h: 20 }~
+- Inside source: true
+*** True Line Result
+ h: 20 }
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~ # set the player movement speed~
+- Inside source: true
+*** True Line Result
+ # set the player movement speed
+** Processing line: ~ args.state.player_speed ||= 5~
+- Inside source: true
+*** True Line Result
+ args.state.player_speed ||= 5
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~ # set the score~
+- Inside source: true
+*** True Line Result
+ # set the score
+** Processing line: ~ args.state.score ||= 0~
+- Inside source: true
+*** True Line Result
+ args.state.score ||= 0
+** Processing line: ~ args.state.teleports ||= 3~
+- Inside source: true
+*** True Line Result
+ args.state.teleports ||= 3
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~ # set the instructions~
+- 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)!"~
+- 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: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~ # ====================================================~
+- Inside source: true
+*** True Line Result
+ # ====================================================
+** Processing line: ~ # render the game~
+- Inside source: true
+*** True Line Result
+ # render the game
+** Processing line: ~ # ====================================================~
+- Inside source: true
+*** True Line Result
+ # ====================================================
+** Processing line: ~ args.outputs.labels << { x: args.grid.w.half, y: args.grid.h - 10,~
+- 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,~
+- Inside source: true
+*** True Line Result
+ text: args.state.instructions,
+** Processing line: ~ alignment_enum: 1 }~
+- Inside source: true
+*** True Line Result
+ alignment_enum: 1 }
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~ # check if it's game over. if so, then render game over~
+- 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~
+- Inside source: true
+*** True Line Result
+ # otherwise render the current time left
+** Processing line: ~ if game_over? args~
+- Inside source: true
+*** True Line Result
+ if game_over? args
+** Processing line: ~ args.outputs.labels << { x: args.grid.w.half,~
+- Inside source: true
+*** True Line Result
+ args.outputs.labels << { x: args.grid.w.half,
+** Processing line: ~ y: args.grid.h - 40,~
+- Inside source: true
+*** True Line Result
+ y: args.grid.h - 40,
+** Processing line: ~ text: "game over! (press r to start over)",~
+- Inside source: true
+*** True Line Result
+ text: "game over! (press r to start over)",
+** Processing line: ~ alignment_enum: 1 }~
+- Inside source: true
+*** True Line Result
+ alignment_enum: 1 }
+** Processing line: ~ else~
+- Inside source: true
+*** True Line Result
+ else
+** Processing line: ~ args.outputs.labels << { x: args.grid.w.half,~
+- Inside source: true
+*** True Line Result
+ args.outputs.labels << { x: args.grid.w.half,
+** Processing line: ~ y: args.grid.h - 40,~
+- Inside source: true
+*** True Line Result
+ y: args.grid.h - 40,
+** Processing line: ~ text: "time left: #{(args.state.count_down.idiv 60) + 1}",~
+- Inside source: true
+*** True Line Result
+ text: "time left: #{(args.state.count_down.idiv 60) + 1}",
+** Processing line: ~ alignment_enum: 1 }~
+- Inside source: true
+*** True Line Result
+ alignment_enum: 1 }
+** Processing line: ~ end~
+- Inside source: true
+*** True Line Result
+ end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~ # render the score~
+- Inside source: true
+*** True Line Result
+ # render the score
+** Processing line: ~ args.outputs.labels << { x: args.grid.w.half,~
+- Inside source: true
+*** True Line Result
+ args.outputs.labels << { x: args.grid.w.half,
+** Processing line: ~ y: args.grid.h - 70,~
+- Inside source: true
+*** True Line Result
+ y: args.grid.h - 70,
+** Processing line: ~ text: "score: #{args.state.score}",~
+- Inside source: true
+*** True Line Result
+ text: "score: #{args.state.score}",
+** Processing line: ~ alignment_enum: 1 }~
+- Inside source: true
+*** True Line Result
+ alignment_enum: 1 }
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~ # render the player with teleport count~
+- Inside source: true
+*** True Line Result
+ # render the player with teleport count
+** Processing line: ~ args.outputs.sprites << { x: args.state.player.x,~
+- Inside source: true
+*** True Line Result
+ args.outputs.sprites << { x: args.state.player.x,
+** Processing line: ~ y: args.state.player.y,~
+- Inside source: true
+*** True Line Result
+ y: args.state.player.y,
+** Processing line: ~ w: args.state.player.w,~
+- Inside source: true
+*** True Line Result
+ w: args.state.player.w,
+** Processing line: ~ h: args.state.player.h,~
+- Inside source: true
+*** True Line Result
+ h: args.state.player.h,
+** Processing line: ~ path: 'sprites/square-green.png' }~
+- Inside source: true
+*** True Line Result
+ path: 'sprites/square-green.png' }
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~ args.outputs.labels << { x: args.state.player.x + 10,~
+- Inside source: true
+*** True Line Result
+ args.outputs.labels << { x: args.state.player.x + 10,
+** Processing line: ~ y: args.state.player.y + 40,~
+- Inside source: true
+*** True Line Result
+ y: args.state.player.y + 40,
+** Processing line: ~ text: "teleports: #{args.state.teleports}",~
+- Inside source: true
+*** True Line Result
+ text: "teleports: #{args.state.teleports}",
+** Processing line: ~ alignment_enum: 1, size_enum: -2 }~
+- Inside source: true
+*** True Line Result
+ alignment_enum: 1, size_enum: -2 }
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~ # render the target~
+- Inside source: true
+*** True Line Result
+ # render the target
+** Processing line: ~ args.outputs.sprites << { x: args.state.target.x,~
+- Inside source: true
+*** True Line Result
+ args.outputs.sprites << { x: args.state.target.x,
+** Processing line: ~ y: args.state.target.y,~
+- Inside source: true
+*** True Line Result
+ y: args.state.target.y,
+** Processing line: ~ w: args.state.target.w,~
+- Inside source: true
+*** True Line Result
+ 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: ~ # ====================================================~
+- Inside source: true
+*** True Line Result
+ # ====================================================
+** Processing line: ~ # run simulation~
+- Inside source: true
+*** True Line Result
+ # run simulation
+** Processing line: ~ # ====================================================~
+- Inside source: true
+*** True Line Result
+ # ====================================================
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~ # count down calculation~
+- Inside source: true
+*** True Line Result
+ # count down calculation
+** Processing line: ~ args.state.count_down -= 1~
+- Inside source: true
+*** True Line Result
+ args.state.count_down -= 1
+** Processing line: ~ args.state.count_down = -1 if args.state.count_down < -1~
+- Inside source: true
+*** True Line Result
+ args.state.count_down = -1 if args.state.count_down < -1
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~ # ====================================================~
+- Inside source: true
+*** True Line Result
+ # ====================================================
+** Processing line: ~ # process player input~
+- Inside source: true
+*** True Line Result
+ # process player input
+** Processing line: ~ # ====================================================~
+- Inside source: true
+*** True Line Result
+ # ====================================================
+** Processing line: ~ # if it isn't game over let them move~
+- Inside source: true
+*** True Line Result
+ # if it isn't game over let them move
+** Processing line: ~ if !game_over? args~
+- Inside source: true
+*** True Line Result
+ if !game_over? args
+** Processing line: ~ dir_y = 0~
+- Inside source: true
+*** True Line Result
+ 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: ~ # determine the change horizontally~
+- Inside source: true
+*** True Line Result
+ # determine the change horizontally
+** Processing line: ~ if args.inputs.keyboard.up~
+- Inside source: true
+*** True Line Result
+ if args.inputs.keyboard.up
+** Processing line: ~ dir_y += args.state.player_speed~
+- Inside source: true
+*** True Line Result
+ dir_y += args.state.player_speed
+** Processing line: ~ elsif args.inputs.keyboard.down~
+- Inside source: true
+*** True Line Result
+ elsif args.inputs.keyboard.down
+** Processing line: ~ dir_y -= args.state.player_speed~
+- Inside source: true
+*** True Line Result
+ dir_y -= args.state.player_speed
+** Processing line: ~ end~
+- Inside source: true
+*** True Line Result
+ end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~ # determine the change vertically~
+- Inside source: true
+*** True Line Result
+ # determine the change vertically
+** Processing line: ~ if args.inputs.keyboard.left~
+- Inside source: true
+*** True Line Result
+ if args.inputs.keyboard.left
+** Processing line: ~ dir_x -= args.state.player_speed~
+- Inside source: true
+*** True Line Result
+ dir_x -= args.state.player_speed
+** Processing line: ~ elsif args.inputs.keyboard.right~
+- Inside source: true
+*** True Line Result
+ elsif args.inputs.keyboard.right
+** Processing line: ~ dir_x += args.state.player_speed~
+- Inside source: true
+*** True Line Result
+ dir_x += args.state.player_speed
+** Processing line: ~ end~
+- Inside source: true
+*** True Line Result
+ end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~ # determine if teleport can be used~
+- 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~
+- Inside source: true
+*** True Line Result
+ if args.inputs.keyboard.key_down.space && args.state.teleports > 0
+** Processing line: ~ args.state.teleports -= 1~
+- Inside source: true
+*** True Line Result
+ args.state.teleports -= 1
+** Processing line: ~ dir_x *= 20~
+- Inside source: true
+*** True Line Result
+ dir_x *= 20
+** Processing line: ~ dir_y *= 20~
+- Inside source: true
+*** True Line Result
+ dir_y *= 20
+** Processing line: ~ end~
+- Inside source: true
+*** True Line Result
+ end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~ # apply change to player~
+- Inside source: true
+*** True Line Result
+ # apply change to player
+** Processing line: ~ args.state.player.x += dir_x~
+- Inside source: true
+*** True Line Result
+ args.state.player.x += dir_x
+** Processing line: ~ args.state.player.y += dir_y~
+- Inside source: true
+*** True Line Result
+ args.state.player.y += dir_y
+** Processing line: ~ else~
+- Inside source: true
+*** True Line Result
+ else
+** Processing line: ~ # if r is pressed, reset the game~
+- Inside source: true
+*** True Line Result
+ # if r is pressed, reset the game
+** Processing line: ~ if args.inputs.keyboard.key_down.r~
+- Inside source: true
+*** True Line Result
+ if args.inputs.keyboard.key_down.r
+** Processing line: ~ $gtk.reset~
+- Inside source: true
+*** True Line Result
+ $gtk.reset
+** Processing line: ~ return~
+- Inside source: true
+*** True Line Result
+ return
+** 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: ~ # ====================================================~
+- Inside source: true
+*** True Line Result
+ # ====================================================
+** Processing line: ~ # determine score~
+- Inside source: true
+*** True Line Result
+ # determine score
+** Processing line: ~ # ====================================================~
+- Inside source: true
+*** True Line Result
+ # ====================================================
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~ # calculate new score if the player is at goal~
+- Inside source: true
+*** True Line Result
+ # calculate new score if the player is at goal
+** Processing line: ~ if !game_over? args~
+- Inside source: true
+*** True Line Result
+ if !game_over? args
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~ # if the player is at the goal, then move the goal~
+- 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~
+- Inside source: true
+*** True Line Result
+ if args.state.player.intersect_rect? args.state.target
+** Processing line: ~ # increment the goal~
+- Inside source: true
+*** True Line Result
+ # increment the goal
+** Processing line: ~ args.state.score += 1~
+- Inside source: true
+*** True Line Result
+ args.state.score += 1
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~ # move the goal to a random location~
+- 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 }~
+- Inside source: true
+*** True Line Result
+ 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: ~ # make sure the goal is inside the view area~
+- Inside source: true
+*** True Line Result
+ # make sure the goal is inside the view area
+** Processing line: ~ if args.state.target.x < 0~
+- Inside source: true
+*** True Line Result
+ if args.state.target.x < 0
+** Processing line: ~ args.state.target.x += 20~
+- Inside source: true
+*** True Line Result
+ args.state.target.x += 20
+** Processing line: ~ elsif args.state.target.x > 1280~
+- Inside source: true
+*** True Line Result
+ elsif args.state.target.x > 1280
+** Processing line: ~ args.state.target.x -= 20~
+- Inside source: true
+*** True Line Result
+ 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: ~ # make sure the goal is inside the view area~
+- Inside source: true
+*** True Line Result
+ # make sure the goal is inside the view area
+** Processing line: ~ if args.state.target.y < 0~
+- Inside source: true
+*** True Line Result
+ if args.state.target.y < 0
+** Processing line: ~ args.state.target.y += 20~
+- Inside source: true
+*** True Line Result
+ args.state.target.y += 20
+** Processing line: ~ elsif args.state.target.y > 720~
+- Inside source: true
+*** True Line Result
+ 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
+ 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 game_over? args~
+- Inside source: true
+*** True Line Result
+ def game_over? args
+** Processing line: ~ args.state.count_down < 0~
+- Inside source: true
+*** True Line Result
+ args.state.count_down < 0
+** Processing line: ~ end~
+- Inside source: true
+*** True Line Result
+ end
+** Processing line: ~~
+- 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
+#+end_src
+** 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.
+*** True Line Result
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~ # ./samples/99_genre_teentiny/license.txt~
+- Inside source: true
+*** True Line Result
+ # ./samples/99_genre_teentiny/license.txt
+** Processing line: ~ Copyright 2019 DragonRuby LLC~
+- Inside source: true
+*** True Line Result
+ Copyright 2019 DragonRuby LLC
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~ MIT License~
+- Inside source: true
+*** True Line Result
+ MIT License
+** Processing line: ~~
+- 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:~
+- 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: ~~
+- 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.~
+- 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: ~~
+- 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.~
+- 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.
+** 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: ~** OSS~
- Header detected.
*** True Line Result
@@ -148622,6 +149626,74 @@ 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: ~ def method_missing name, *args, &block~
+- Inside source: true
+*** True Line Result
+ def method_missing name, *args, &block
+** Processing line: ~ if (args.length <= 1) && (@state.as_hash.key? name)~
+- Inside source: true
+*** True Line Result
+ if (args.length <= 1) && (@state.as_hash.key? name)
+** Processing line: ~ raise <<-S~
+- Inside source: true
+*** True Line Result
+ raise <<-S
+** Processing line: ~ * ERROR - :#{name} method missing on ~#{self.class.name}~.~
+- Inside source: true
+*** True Line Result
+ * ERROR - :#{name} method missing on ~#{self.class.name}~.
+** Processing line: ~ The method~
+- Inside source: true
+*** True Line Result
+ The method
+** Processing line: ~ :#{name}~
+- Inside source: true
+*** True Line Result
+ :#{name}
+** Processing line: ~ with args~
+- Inside source: true
+*** True Line Result
+ with args
+** Processing line: ~ #{args}~
+- Inside source: true
+*** True Line Result
+ #{args}
+** Processing line: ~ doesn't exist on #{inspect}.~
+- Inside source: true
+*** True Line Result
+ doesn't exist on #{inspect}.
+** Processing line: ~ ** POSSIBLE SOLUTION - ~args.state.#{name}~ exists.~
+- Inside source: true
+*** True Line Result
+ ** POSSIBLE SOLUTION - ~args.state.#{name}~ exists.
+** Processing line: ~ Did you forget ~.state~ before ~.#{name}~?~
+- Inside source: true
+*** True Line Result
+ Did you forget ~.state~ before ~.#{name}~?
+** Processing line: ~ S~
+- Inside source: true
+*** True Line Result
+ S
+** Processing line: ~ end~
+- Inside source: true
+*** True Line Result
+ end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~ super~
+- Inside source: true
+*** True Line Result
+ super
+** Processing line: ~ end~
+- Inside source: true
+*** True Line Result
+ end
** Processing line: ~ end~
- Inside source: true
*** True Line Result
@@ -149510,6 +150582,10 @@ Follows is a source code listing for all files that have been open sourced. This
- Inside source: true
*** True Line Result
# ./dragon/attr_sprite.rb
+** Processing line: ~ # coding: utf-8~
+- Inside source: true
+*** True Line Result
+ # coding: utf-8
** Processing line: ~ # Copyright 2019 DragonRuby LLC~
- Inside source: true
*** True Line Result
@@ -149766,6 +150842,10 @@ Follows is a source code listing for all files that have been open sourced. This
- Inside source: true
*** True Line Result
# ./dragon/console.rb
+** Processing line: ~ # coding: utf-8~
+- Inside source: true
+*** True Line Result
+ # coding: utf-8
** Processing line: ~ # Copyright 2019 DragonRuby LLC~
- Inside source: true
*** True Line Result
@@ -151506,6 +152586,10 @@ Follows is a source code listing for all files that have been open sourced. This
- Inside source: true
*** True Line Result
toggle
+** Processing line: ~ args.inputs.keyboard.clear if !@visible~
+- Inside source: true
+*** True Line Result
+ args.inputs.keyboard.clear if !@visible
** Processing line: ~ end~
- Inside source: true
*** True Line Result
@@ -151550,10 +152634,46 @@ Follows is a source code listing for all files that have been open sourced. This
- Inside source: true
*** True Line Result
if args.inputs.keyboard.key_down.enter
-** Processing line: ~ eval_the_set_command~
+** Processing line: ~ if slide_progress > 0.5~
+- Inside source: true
+*** True Line Result
+ if slide_progress > 0.5
+** Processing line: ~ # in the event of an exception, the console window pops up~
+- Inside source: true
+*** True Line Result
+ # in the event of an exception, the console window pops up
+** Processing line: ~ # and is pre-filled with $gtk.reset.~
+- Inside source: true
+*** True Line Result
+ # and is pre-filled with $gtk.reset.
+** Processing line: ~ # there is an annoying scenario where the exception could be thrown~
+- Inside source: true
+*** True Line Result
+ # there is an annoying scenario where the exception could be thrown
+** Processing line: ~ # by pressing enter (while playing the game). if you press enter again~
- Inside source: true
*** True Line Result
- eval_the_set_command
+ # by pressing enter (while playing the game). if you press enter again
+** Processing line: ~ # quickly, then the game is reset which closes the console.~
+- Inside source: true
+*** True Line Result
+ # quickly, then the game is reset which closes the console.
+** Processing line: ~ # so enter in the console is only evaluated if the slide_progress~
+- Inside source: true
+*** True Line Result
+ # so enter in the console is only evaluated if the slide_progress
+** Processing line: ~ # is atleast half way down the page.~
+- Inside source: true
+*** True Line Result
+ # is atleast half way down the page.
+** Processing line: ~ eval_the_set_command~
+- Inside source: true
+*** True Line Result
+ eval_the_set_command
+** Processing line: ~ end~
+- Inside source: true
+*** True Line Result
+ end
** Processing line: ~ elsif args.inputs.keyboard.key_down.v~
- Inside source: true
*** True Line Result
@@ -153030,6 +154150,10 @@ Follows is a source code listing for all files that have been open sourced. This
- Inside source: true
*** True Line Result
# ./dragon/console_color.rb
+** Processing line: ~ # coding: utf-8~
+- Inside source: true
+*** True Line Result
+ # coding: utf-8
** Processing line: ~ # Copyright 2019 DragonRuby LLC~
- Inside source: true
*** True Line Result
@@ -153194,6 +154318,10 @@ Follows is a source code listing for all files that have been open sourced. This
- Inside source: true
*** True Line Result
# ./dragon/console_font_style.rb
+** Processing line: ~ # coding: utf-8~
+- Inside source: true
+*** True Line Result
+ # coding: utf-8
** Processing line: ~ # Copyright 2019 DragonRuby LLC~
- Inside source: true
*** True Line Result
@@ -153382,6 +154510,10 @@ Follows is a source code listing for all files that have been open sourced. This
- Inside source: true
*** True Line Result
# ./dragon/console_menu.rb
+** Processing line: ~ # coding: utf-8~
+- Inside source: true
+*** True Line Result
+ # coding: utf-8
** Processing line: ~ # Copyright 2019 DragonRuby LLC~
- Inside source: true
*** True Line Result
@@ -154050,6 +155182,10 @@ Follows is a source code listing for all files that have been open sourced. This
- Inside source: true
*** True Line Result
# ./dragon/console_prompt.rb
+** Processing line: ~ # coding: utf-8~
+- Inside source: true
+*** True Line Result
+ # coding: utf-8
** Processing line: ~ # Copyright 2019 DragonRuby LLC~
- Inside source: true
*** True Line Result
@@ -164678,10 +165814,10 @@ Follows is a source code listing for all files that have been open sourced. This
- Inside source: true
*** True Line Result
# ./dragon/ios_wizard.rb
-** Processing line: ~ # Contributors outside of DragonRuby who also hold Copyright: Michał Dudziński~
+** Processing line: ~ # coding: utf-8~
- Inside source: true
*** True Line Result
- # Contributors outside of DragonRuby who also hold Copyright: Michał Dudziński
+ # coding: utf-8
** Processing line: ~ # Copyright 2019 DragonRuby LLC~
- Inside source: true
*** True Line Result
@@ -164698,6 +165834,14 @@ Follows is a source code listing for all files that have been open sourced. This
- Inside source: true
*** True Line Result
+** Processing line: ~ # Contributors outside of DragonRuby who also hold Copyright: Michał Dudziński~
+- Inside source: true
+*** True Line Result
+ # Contributors outside of DragonRuby who also hold Copyright: Michał Dudziński
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
** Processing line: ~ class IOSWizard < Wizard~
- Inside source: true
*** True Line Result
@@ -169134,6 +170278,10 @@ Follows is a source code listing for all files that have been open sourced. This
- Inside source: true
*** True Line Result
# ./dragon/itch_wizard.rb
+** Processing line: ~ # coding: utf-8~
+- Inside source: true
+*** True Line Result
+ # coding: utf-8
** Processing line: ~ # Copyright 2019 DragonRuby LLC~
- Inside source: true
*** True Line Result
@@ -170186,6 +171334,10 @@ Follows is a source code listing for all files that have been open sourced. This
- Inside source: true
*** True Line Result
# ./dragon/layout.rb
+** Processing line: ~ # coding: utf-8~
+- Inside source: true
+*** True Line Result
+ # coding: utf-8
** Processing line: ~ # Copyright 2019 DragonRuby LLC~
- Inside source: true
*** True Line Result
@@ -173886,10 +175038,10 @@ Follows is a source code listing for all files that have been open sourced. This
- Inside source: true
*** True Line Result
# ./dragon/metadata.rb
-** Processing line: ~ # Contributors outside of DragonRuby who also hold Copyright: Michał Dudziński~
+** Processing line: ~ # coding: utf-8~
- Inside source: true
*** True Line Result
- # Contributors outside of DragonRuby who also hold Copyright: Michał Dudziński
+ # coding: utf-8
** Processing line: ~ # Copyright 2021 DragonRuby LLC~
- Inside source: true
*** True Line Result
@@ -173906,6 +175058,14 @@ Follows is a source code listing for all files that have been open sourced. This
- Inside source: true
*** True Line Result
+** Processing line: ~ # Contributors outside of DragonRuby who also hold Copyright: Michał Dudziński~
+- Inside source: true
+*** True Line Result
+ # Contributors outside of DragonRuby who also hold Copyright: Michał Dudziński
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
** Processing line: ~ module Metadata~
- Inside source: true
*** True Line Result
@@ -178178,6 +179338,10 @@ Follows is a source code listing for all files that have been open sourced. This
- Inside source: true
*** True Line Result
# ./dragon/runtime/autocomplete.rb
+** Processing line: ~ # coding: utf-8~
+- Inside source: true
+*** True Line Result
+ # coding: utf-8
** Processing line: ~ # Copyright 2019 DragonRuby LLC~
- Inside source: true
*** True Line Result
@@ -178806,6 +179970,10 @@ Follows is a source code listing for all files that have been open sourced. This
- Inside source: true
*** True Line Result
# ./dragon/runtime/benchmark.rb
+** Processing line: ~ # coding: utf-8~
+- Inside source: true
+*** True Line Result
+ # coding: utf-8
** Processing line: ~ # Copyright 2019 DragonRuby LLC~
- Inside source: true
*** True Line Result
@@ -179278,6 +180446,10 @@ Follows is a source code listing for all files that have been open sourced. This
- Inside source: true
*** True Line Result
# ./dragon/runtime/draw.rb
+** Processing line: ~ # coding: utf-8~
+- Inside source: true
+*** True Line Result
+ # coding: utf-8
** Processing line: ~ # Copyright 2019 DragonRuby LLC~
- Inside source: true
*** True Line Result
@@ -179942,6 +181114,10 @@ Follows is a source code listing for all files that have been open sourced. This
- Inside source: true
*** True Line Result
# ./dragon/runtime/framerate.rb
+** Processing line: ~ # coding: utf-8~
+- Inside source: true
+*** True Line Result
+ # coding: utf-8
** Processing line: ~ # Copyright 2019 DragonRuby LLC~
- Inside source: true
*** True Line Result
@@ -180086,30 +181262,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 !@framerate_important_notification_happened~
-- Inside source: true
-*** True Line Result
- if !@framerate_important_notification_happened
-** Processing line: ~ log_important framerate_warning_message~
-- Inside source: true
-*** True Line Result
- log_important framerate_warning_message
-** Processing line: ~ else~
-- Inside source: true
-*** True Line Result
- else
-** Processing line: ~ log framerate_warning_message~
-- Inside source: true
-*** True Line Result
- log framerate_warning_message
-** Processing line: ~ end~
+** Processing line: ~ log framerate_warning_message~
- Inside source: true
*** True Line Result
- end
-** Processing line: ~ @framerate_important_notification_happened = true~
-- Inside source: true
-*** True Line Result
- @framerate_important_notification_happened = true
+ log framerate_warning_message
** Processing line: ~ end~
- Inside source: true
*** True Line Result
@@ -180302,6 +181458,10 @@ Follows is a source code listing for all files that have been open sourced. This
- Inside source: true
*** True Line Result
# ./dragon/runtime/framerate_diagnostics.rb
+** Processing line: ~ # coding: utf-8~
+- Inside source: true
+*** True Line Result
+ # coding: utf-8
** Processing line: ~ # Copyright 2019 DragonRuby LLC~
- Inside source: true
*** True Line Result
@@ -183626,6 +184786,342 @@ Follows is a source code listing for all files that have been open sourced. This
- End of paragraph detected.
*** True Line Result
+** Processing line: ~*** tweetcart.rb~
+- Header detected.
+*** True Line Result
+
+*** True Line Result
+*** tweetcart.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/tweetcart.rb~
+- Inside source: true
+*** True Line Result
+ # ./dragon/tweetcart.rb
+** Processing line: ~ # coding: utf-8~
+- Inside source: true
+*** True Line Result
+ # coding: utf-8
+** Processing line: ~ # Copyright 2019 DragonRuby LLC~
+- Inside source: true
+*** True Line Result
+ # Copyright 2019 DragonRuby LLC
+** Processing line: ~ # MIT License~
+- Inside source: true
+*** True Line Result
+ # MIT License
+** Processing line: ~ # tweetcart.rb has been released under MIT (*only this file*).~
+- Inside source: true
+*** True Line Result
+ # tweetcart.rb has been released under MIT (*only this file*).
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~ def $top_level.TICK &block~
+- Inside source: true
+*** True Line Result
+ def $top_level.TICK &block
+** Processing line: ~ $top_level.define_method(:tick) do |args|~
+- Inside source: true
+*** True Line Result
+ $top_level.define_method(:tick) do |args|
+** Processing line: ~ args.outputs[:scene].w = 160~
+- Inside source: true
+*** True Line Result
+ args.outputs[:scene].w = 160
+** Processing line: ~ args.outputs[:scene].h = 90~
+- Inside source: true
+*** True Line Result
+ args.outputs[:scene].h = 90
+** Processing line: ~ args.outputs[:scene].background_color = [0, 0, 0, 0]~
+- Inside source: true
+*** True Line Result
+ args.outputs[:scene].background_color = [0, 0, 0, 0]
+** Processing line: ~ block.call args~
+- Inside source: true
+*** True Line Result
+ block.call args
+** Processing line: ~ args.outputs.sprites << { x: 0, y: 0, w: 1280, h: 720, path: :scene }~
+- Inside source: true
+*** True Line Result
+ args.outputs.sprites << { x: 0, y: 0, w: 1280, h: 720, path: :scene }
+** Processing line: ~ end~
+- Inside source: true
+*** True Line Result
+ end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~ def $top_level.bg! *rgb~
+- Inside source: true
+*** True Line Result
+ def $top_level.bg! *rgb
+** Processing line: ~ r,g,b = rgb~
+- Inside source: true
+*** True Line Result
+ r,g,b = rgb
+** Processing line: ~ r ||= 255~
+- Inside source: true
+*** True Line Result
+ r ||= 255
+** Processing line: ~ g ||= r~
+- Inside source: true
+*** True Line Result
+ g ||= r
+** Processing line: ~ b ||= g~
+- Inside source: true
+*** True Line Result
+ b ||= g
+** Processing line: ~ $args.outputs.background_color = [r, g, b]~
+- Inside source: true
+*** True Line Result
+ $args.outputs.background_color = [r, g, b]
+** Processing line: ~ end~
+- Inside source: true
+*** True Line Result
+ end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~ def $top_level.slds~
+- Inside source: true
+*** True Line Result
+ def $top_level.slds
+** Processing line: ~ $args.outputs[:scene].sprites~
+- Inside source: true
+*** True Line Result
+ $args.outputs[:scene].sprites
+** Processing line: ~ end~
+- Inside source: true
+*** True Line Result
+ end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~ def $top_level.slds! *os~
+- Inside source: true
+*** True Line Result
+ def $top_level.slds! *os
+** Processing line: ~ if (os.first.is_a? Numeric)~
+- Inside source: true
+*** True Line Result
+ if (os.first.is_a? Numeric)
+** Processing line: ~ sld! *os~
+- Inside source: true
+*** True Line Result
+ sld! *os
+** Processing line: ~ else~
+- Inside source: true
+*** True Line Result
+ else
+** Processing line: ~ os.each { |o| sld! *o }~
+- Inside source: true
+*** True Line Result
+ os.each { |o| sld! *o }
+** 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 $top_level.sld! *params~
+- Inside source: true
+*** True Line Result
+ def $top_level.sld! *params
+** Processing line: ~ x, y, w, h, r, g, b, a = nil~
+- Inside source: true
+*** True Line Result
+ x, y, w, h, r, g, b, a = nil
+** Processing line: ~ if params.length == 2~
+- Inside source: true
+*** True Line Result
+ if params.length == 2
+** Processing line: ~ x, y = params~
+- Inside source: true
+*** True Line Result
+ x, y = params
+** Processing line: ~ elsif params.length == 3 && (params.last.is_a? Array)~
+- Inside source: true
+*** True Line Result
+ elsif params.length == 3 && (params.last.is_a? Array)
+** Processing line: ~ x = params[0]~
+- Inside source: true
+*** True Line Result
+ x = params[0]
+** Processing line: ~ y = params[1]~
+- Inside source: true
+*** True Line Result
+ y = params[1]
+** Processing line: ~ r, g, b, a = params[2]~
+- Inside source: true
+*** True Line Result
+ r, g, b, a = params[2]
+** Processing line: ~ r ||= 255~
+- Inside source: true
+*** True Line Result
+ r ||= 255
+** Processing line: ~ g ||= r~
+- Inside source: true
+*** True Line Result
+ g ||= r
+** Processing line: ~ b ||= g~
+- Inside source: true
+*** True Line Result
+ b ||= g
+** Processing line: ~ a ||= 255~
+- Inside source: true
+*** True Line Result
+ a ||= 255
+** Processing line: ~ elsif params.length == 4~
+- Inside source: true
+*** True Line Result
+ elsif params.length == 4
+** Processing line: ~ x, y, w, h = params~
+- Inside source: true
+*** True Line Result
+ x, y, w, h = params
+** Processing line: ~ elsif params.length == 5 && (params.last.is_a? Array)~
+- Inside source: true
+*** True Line Result
+ elsif params.length == 5 && (params.last.is_a? Array)
+** Processing line: ~ x = params[0]~
+- Inside source: true
+*** True Line Result
+ x = params[0]
+** Processing line: ~ y = params[1]~
+- Inside source: true
+*** True Line Result
+ y = params[1]
+** Processing line: ~ w = params[2]~
+- Inside source: true
+*** True Line Result
+ w = params[2]
+** Processing line: ~ h = params[3]~
+- Inside source: true
+*** True Line Result
+ h = params[3]
+** Processing line: ~ r,g,b,a = params[4]~
+- Inside source: true
+*** True Line Result
+ r,g,b,a = params[4]
+** Processing line: ~ r ||= 255~
+- Inside source: true
+*** True Line Result
+ r ||= 255
+** Processing line: ~ g ||= r~
+- Inside source: true
+*** True Line Result
+ g ||= r
+** Processing line: ~ b ||= g~
+- Inside source: true
+*** True Line Result
+ b ||= g
+** Processing line: ~ a ||= 255~
+- Inside source: true
+*** True Line Result
+ a ||= 255
+** Processing line: ~ elsif params.length >= 7~
+- Inside source: true
+*** True Line Result
+ elsif params.length >= 7
+** Processing line: ~ x, y, w, h, r, g, b = params~
+- Inside source: true
+*** True Line Result
+ x, y, w, h, r, g, b = params
+** Processing line: ~ else~
+- Inside source: true
+*** True Line Result
+ else
+** Processing line: ~ raise "I don't know how to render #{params} with reasonable defaults."~
+- Inside source: true
+*** True Line Result
+ raise "I don't know how to render #{params} with reasonable defaults."
+** Processing line: ~ end~
+- Inside source: true
+*** True Line Result
+ end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~ w ||= 1~
+- Inside source: true
+*** True Line Result
+ w ||= 1
+** Processing line: ~ h ||= 1~
+- Inside source: true
+*** True Line Result
+ h ||= 1
+** Processing line: ~ r ||= 255~
+- Inside source: true
+*** True Line Result
+ r ||= 255
+** Processing line: ~ g ||= 255~
+- Inside source: true
+*** True Line Result
+ g ||= 255
+** Processing line: ~ b ||= 255~
+- Inside source: true
+*** True Line Result
+ b ||= 255
+** Processing line: ~ a ||= 255~
+- Inside source: true
+*** True Line Result
+ a ||= 255
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~ slds << { x: x, y: y,~
+- Inside source: true
+*** True Line Result
+ slds << { x: x, y: y,
+** Processing line: ~ w: w, h: h,~
+- Inside source: true
+*** True Line Result
+ w: w, h: h,
+** Processing line: ~ r: r, g: g, b: b, a: a,~
+- Inside source: true
+*** True Line Result
+ r: r, g: g, b: b, a: a,
+** Processing line: ~ path: :pixel }~
+- Inside source: true
+*** True Line Result
+ path: :pixel }
+** 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: ~*** wizards.rb~
- Header detected.
*** True Line Result
@@ -183642,6 +185138,10 @@ Follows is a source code listing for all files that have been open sourced. This
- Inside source: true
*** True Line Result
# ./dragon/wizards.rb
+** Processing line: ~ # coding: utf-8~
+- Inside source: true
+*** True Line Result
+ # coding: utf-8
** Processing line: ~ # Copyright 2019 DragonRuby LLC~
- Inside source: true
*** True Line Result
@@ -197599,7 +199099,7 @@ Follows is a source code listing for all files that have been open sourced. This
** Processing line: ~~
** Processing line: ~ def calc_below~
** Processing line: ~ return unless player.dy <= 0~
-** Processing line: ~ tiles_below = find_tiles { |t| t.rect.top <= player.y }~
+** Processing line: ~ tiles_below = find_tiles { |t| t.rect.top <= player.prev_rect.y }~
** Processing line: ~ collision = find_colliding_tile tiles_below, (player.rect.merge y: player.next_rect.y)~
** Processing line: ~ return unless collision~
** Processing line: ~ if collision.neighbors.b == :none && player.jumped_down_at.elapsed_time < 10~
@@ -197630,7 +199130,7 @@ Follows is a source code listing for all files that have been open sourced. This
** Processing line: ~~
** Processing line: ~ def calc_above~
** Processing line: ~ return unless player.dy > 0~
-** Processing line: ~ tiles_above = find_tiles { |t| t.rect.y >= player.y }~
+** Processing line: ~ tiles_above = find_tiles { |t| t.rect.y >= player.prev_rect.y }~
** Processing line: ~ collision = find_colliding_tile tiles_above, (player.rect.merge y: player.next_rect.y)~
** Processing line: ~ return unless collision~
** Processing line: ~ return if collision.neighbors.t == :none~
@@ -205156,6 +206656,74 @@ 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 - Render Target Noclear - main.rb~
+- H3 detected.
+- Determining if line is a header.
+- Line contains ~*** ~... gsub-ing empty string
+- Formatting line: ~Advanced Rendering - Render Target Noclear - 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 - Render Target Noclear - 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/11_render_target_noclear/app/main.rb~
+** Processing line: ~ def tick args~
+** Processing line: ~ args.state.x ||= 500~
+** Processing line: ~ args.state.y ||= 350~
+** Processing line: ~ args.state.xinc ||= 7~
+** Processing line: ~ args.state.yinc ||= 7~
+** Processing line: ~ args.state.bgcolor ||= 1~
+** Processing line: ~ args.state.bginc ||= 1~
+** Processing line: ~~
+** Processing line: ~ # clear the render target on the first tick, and then never again. Draw~
+** Processing line: ~ # another box to it every tick, accumulating over time.~
+** Processing line: ~ clear_target = (args.state.tick_count == 0) || (args.inputs.keyboard.key_down.space)~
+** Processing line: ~ args.render_target(:accumulation).background_color = [ 0, 0, 0, 0 ];~
+** Processing line: ~ args.render_target(:accumulation).clear_before_render = clear_target~
+** Processing line: ~ args.render_target(:accumulation).solids << [args.state.x, args.state.y, 25, 25, 255, 0, 0, 255];~
+** Processing line: ~ args.state.x += args.state.xinc~
+** Processing line: ~ args.state.y += args.state.yinc~
+** Processing line: ~ args.state.bgcolor += args.state.bginc~
+** Processing line: ~~
+** Processing line: ~ # animation upkeep...change where we draw the next box and what color the~
+** Processing line: ~ # window background will be.~
+** Processing line: ~ if args.state.xinc > 0 && args.state.x >= 1280~
+** Processing line: ~ args.state.xinc = -7~
+** Processing line: ~ elsif args.state.xinc < 0 && args.state.x < 0~
+** Processing line: ~ args.state.xinc = 7~
+** Processing line: ~ end~
+** Processing line: ~~
+** Processing line: ~ if args.state.yinc > 0 && args.state.y >= 720~
+** Processing line: ~ args.state.yinc = -7~
+** Processing line: ~ elsif args.state.yinc < 0 && args.state.y < 0~
+** Processing line: ~ args.state.yinc = 7~
+** Processing line: ~ end~
+** Processing line: ~~
+** Processing line: ~ if args.state.bginc > 0 && args.state.bgcolor >= 255~
+** Processing line: ~ args.state.bginc = -1~
+** Processing line: ~ elsif args.state.bginc < 0 && args.state.bgcolor <= 0~
+** Processing line: ~ args.state.bginc = 1~
+** Processing line: ~ end~
+** Processing line: ~~
+** Processing line: ~ # clear the screen to a shade of blue and draw the render target, which~
+** Processing line: ~ # is not clearing every frame, on top of it. Note that you can NOT opt to~
+** Processing line: ~ # skip clearing the screen, only render targets. The screen clears every~
+** Processing line: ~ # frame; double-buffering would prevent correct updates between frames.~
+** Processing line: ~ args.outputs.background_color = [ 0, 0, args.state.bgcolor, 255 ]~
+** Processing line: ~ args.outputs.sprites << [ 0, 0, 1280, 720, :accumulation ]~
+** Processing line: ~ end~
+** Processing line: ~~
+** Processing line: ~ $gtk.reset~
+** Processing line: ~~
+** Processing line: ~#+end_src~
+- PRE end detected.
+** Processing line: ~~
+** Processing line: ~~
** Processing line: ~*** Tweening Lerping Easing Functions - Easing Functions - main.rb~
- H3 detected.
- Determining if line is a header.
@@ -207324,12 +208892,12 @@ Follows is a source code listing for all files that have been open sourced. This
** Processing line: ~ GTK::Entity.__reset_id__!~
** Processing line: ~ args.state.player_one = "test"~
** Processing line: ~ result = args.gtk.serialize_state args.state~
-** Processing line: ~ assert.equal! result, "{:entity_id=>3, :entity_keys_by_ref=>{}, :tick_count=>-1, :player_one=>\"test\"}"~
+** Processing line: ~ assert.equal! result, "{:entity_id=>4, :entity_keys_by_ref=>{}, :tick_count=>-1, :player_one=>\"test\"}"~
** Processing line: ~~
** Processing line: ~ GTK::Entity.__reset_id__!~
** Processing line: ~ args.gtk.write_file 'state.txt', ''~
** Processing line: ~ result = args.gtk.serialize_state 'state.txt', args.state~
-** Processing line: ~ assert.equal! result, "{:entity_id=>3, :entity_keys_by_ref=>{}, :tick_count=>-1, :player_one=>\"test\"}"~
+** Processing line: ~ assert.equal! result, "{:entity_id=>4, :entity_keys_by_ref=>{}, :tick_count=>-1, :player_one=>\"test\"}"~
** Processing line: ~ end~
** Processing line: ~~
** Processing line: ~ def test_deserialize args, assert~
@@ -207378,7 +208946,7 @@ Follows is a source code listing for all files that have been open sourced. This
** Processing line: ~ args.state.player_two = args.state.new_entity_strict(:player_strict, name: "Ken", blood_type: nil)~
** Processing line: ~~
** Processing line: ~ serialized_state = args.gtk.serialize_state args.state~
-** Processing line: ~ 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}}'~
+** Processing line: ~ 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}}'~
** Processing line: ~~
** Processing line: ~ GTK::Entity.__reset_id__!~
** Processing line: ~ deserialized_state = args.gtk.deserialize_state serialized_state~
@@ -207436,6 +209004,18 @@ Follows is a source code listing for all files that have been open sourced. This
** Processing line: ~ assert.equal! deserialized_state.strict_entity.one, deserialized_state.strict_entity.two~
** Processing line: ~ end~
** Processing line: ~~
+** Processing line: ~ def test_serialization_excludes_thrash_count args, assert~
+** Processing line: ~ GTK::Entity.__reset_id__!~
+** Processing line: ~ args.state.player.name = "Ryu"~
+** Processing line: ~ # force a nil pun~
+** Processing line: ~ if args.state.player.age > 30~
+** Processing line: ~ end~
+** Processing line: ~ assert.equal! args.state.player.as_hash[:__thrash_count__][:>], 1~
+** Processing line: ~ result = args.gtk.serialize_state args.state~
+** Processing line: ~ assert.false! (result.include? "__thrash_count__"),~
+** Processing line: ~ "The __thrash_count__ key exists in state when it shouldn't have."~
+** Processing line: ~ end~
+** Processing line: ~~
** Processing line: ~#+end_src~
- PRE end detected.
** Processing line: ~~
@@ -230006,6 +231586,219 @@ 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~
+- H3 detected.
+- Determining if line is a header.
+- Line contains ~*** ~... gsub-ing empty string
+- Formatting line: ~Teentiny - 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~
+- 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: ~ # 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~
+** Processing line: ~ # ====================================================~
+** Processing line: ~ # initialize default variables~
+** Processing line: ~ # ====================================================~
+** Processing line: ~~
+** Processing line: ~ # 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~
+** Processing line: ~ # set the initial position of the target~
+** Processing line: ~ args.state.target ||= { x: args.grid.w.half,~
+** Processing line: ~ y: args.grid.h.half,~
+** Processing line: ~ w: 20,~
+** Processing line: ~ h: 20 }~
+** Processing line: ~~
+** Processing line: ~ # set the initial position of the player~
+** Processing line: ~ args.state.player ||= { x: 50,~
+** Processing line: ~ y: 50,~
+** Processing line: ~ w: 20,~
+** Processing line: ~ h: 20 }~
+** Processing line: ~~
+** Processing line: ~ # set the player movement speed~
+** Processing line: ~ args.state.player_speed ||= 5~
+** Processing line: ~~
+** Processing line: ~ # set the score~
+** Processing line: ~ args.state.score ||= 0~
+** Processing line: ~ args.state.teleports ||= 3~
+** Processing line: ~~
+** Processing line: ~ # set the instructions~
+** Processing line: ~ args.state.instructions ||= "Get to the red goal! Use arrow keys to move. Spacebar to teleport (use them carefully)!"~
+** Processing line: ~~
+** Processing line: ~ # ====================================================~
+** Processing line: ~ # render the game~
+** Processing line: ~ # ====================================================~
+** Processing line: ~ args.outputs.labels << { x: args.grid.w.half, y: args.grid.h - 10,~
+** Processing line: ~ text: args.state.instructions,~
+** Processing line: ~ alignment_enum: 1 }~
+** Processing line: ~~
+** Processing line: ~ # check if it's game over. if so, then render game over~
+** Processing line: ~ # otherwise render the current time left~
+** Processing line: ~ if game_over? args~
+** Processing line: ~ args.outputs.labels << { x: args.grid.w.half,~
+** Processing line: ~ y: args.grid.h - 40,~
+** Processing line: ~ text: "game over! (press r to start over)",~
+** Processing line: ~ alignment_enum: 1 }~
+** Processing line: ~ else~
+** Processing line: ~ args.outputs.labels << { x: args.grid.w.half,~
+** Processing line: ~ y: args.grid.h - 40,~
+** Processing line: ~ text: "time left: #{(args.state.count_down.idiv 60) + 1}",~
+** Processing line: ~ alignment_enum: 1 }~
+** Processing line: ~ end~
+** Processing line: ~~
+** Processing line: ~ # render the score~
+** Processing line: ~ args.outputs.labels << { x: args.grid.w.half,~
+** Processing line: ~ y: args.grid.h - 70,~
+** Processing line: ~ text: "score: #{args.state.score}",~
+** Processing line: ~ alignment_enum: 1 }~
+** Processing line: ~~
+** Processing line: ~ # render the player with teleport count~
+** Processing line: ~ args.outputs.sprites << { x: args.state.player.x,~
+** Processing line: ~ y: args.state.player.y,~
+** Processing line: ~ w: args.state.player.w,~
+** Processing line: ~ h: args.state.player.h,~
+** Processing line: ~ path: 'sprites/square-green.png' }~
+** Processing line: ~~
+** Processing line: ~ args.outputs.labels << { x: args.state.player.x + 10,~
+** Processing line: ~ y: args.state.player.y + 40,~
+** Processing line: ~ text: "teleports: #{args.state.teleports}",~
+** Processing line: ~ alignment_enum: 1, size_enum: -2 }~
+** Processing line: ~~
+** Processing line: ~ # render the target~
+** Processing line: ~ args.outputs.sprites << { x: args.state.target.x,~
+** Processing line: ~ y: args.state.target.y,~
+** Processing line: ~ w: args.state.target.w,~
+** Processing line: ~ h: args.state.target.h,~
+** Processing line: ~ path: 'sprites/square-red.png' }~
+** Processing line: ~~
+** Processing line: ~ # ====================================================~
+** Processing line: ~ # run simulation~
+** Processing line: ~ # ====================================================~
+** Processing line: ~~
+** Processing line: ~ # count down calculation~
+** Processing line: ~ args.state.count_down -= 1~
+** Processing line: ~ args.state.count_down = -1 if args.state.count_down < -1~
+** Processing line: ~~
+** Processing line: ~ # ====================================================~
+** Processing line: ~ # process player input~
+** Processing line: ~ # ====================================================~
+** Processing line: ~ # if it isn't game over let them move~
+** Processing line: ~ if !game_over? args~
+** Processing line: ~ dir_y = 0~
+** Processing line: ~ dir_x = 0~
+** Processing line: ~~
+** Processing line: ~ # determine the change horizontally~
+** Processing line: ~ if args.inputs.keyboard.up~
+** Processing line: ~ dir_y += args.state.player_speed~
+** Processing line: ~ elsif args.inputs.keyboard.down~
+** Processing line: ~ dir_y -= args.state.player_speed~
+** Processing line: ~ end~
+** Processing line: ~~
+** Processing line: ~ # determine the change vertically~
+** Processing line: ~ if args.inputs.keyboard.left~
+** Processing line: ~ dir_x -= args.state.player_speed~
+** Processing line: ~ elsif args.inputs.keyboard.right~
+** Processing line: ~ dir_x += args.state.player_speed~
+** Processing line: ~ end~
+** Processing line: ~~
+** Processing line: ~ # determine if teleport can be used~
+** Processing line: ~ if args.inputs.keyboard.key_down.space && args.state.teleports > 0~
+** Processing line: ~ args.state.teleports -= 1~
+** Processing line: ~ dir_x *= 20~
+** Processing line: ~ dir_y *= 20~
+** Processing line: ~ end~
+** Processing line: ~~
+** Processing line: ~ # apply change to player~
+** Processing line: ~ args.state.player.x += dir_x~
+** Processing line: ~ args.state.player.y += dir_y~
+** Processing line: ~ else~
+** Processing line: ~ # if r is pressed, reset the game~
+** Processing line: ~ if args.inputs.keyboard.key_down.r~
+** Processing line: ~ $gtk.reset~
+** Processing line: ~ return~
+** Processing line: ~ end~
+** Processing line: ~ end~
+** Processing line: ~~
+** Processing line: ~ # ====================================================~
+** Processing line: ~ # determine score~
+** Processing line: ~ # ====================================================~
+** Processing line: ~~
+** Processing line: ~ # calculate new score if the player is at goal~
+** Processing line: ~ if !game_over? args~
+** Processing line: ~~
+** Processing line: ~ # if the player is at the goal, then move the goal~
+** Processing line: ~ if args.state.player.intersect_rect? args.state.target~
+** Processing line: ~ # increment the goal~
+** Processing line: ~ args.state.score += 1~
+** Processing line: ~~
+** Processing line: ~ # 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 }~
+** Processing line: ~~
+** Processing line: ~ # make sure the goal is inside the view area~
+** Processing line: ~ if args.state.target.x < 0~
+** Processing line: ~ args.state.target.x += 20~
+** Processing line: ~ elsif args.state.target.x > 1280~
+** Processing line: ~ args.state.target.x -= 20~
+** Processing line: ~ end~
+** Processing line: ~~
+** Processing line: ~ # make sure the goal is inside the view area~
+** Processing line: ~ if args.state.target.y < 0~
+** Processing line: ~ args.state.target.y += 20~
+** Processing line: ~ elsif args.state.target.y > 720~
+** Processing line: ~ args.state.target.y -= 20~
+** Processing line: ~ end~
+** Processing line: ~ end~
+** Processing line: ~ end~
+** Processing line: ~ end~
+** Processing line: ~~
+** Processing line: ~ def game_over? args~
+** Processing line: ~ args.state.count_down < 0~
+** Processing line: ~ end~
+** Processing line: ~~
+** Processing line: ~ $gtk.reset~
+** Processing line: ~~
+** Processing line: ~#+end_src~
+- PRE end detected.
+** Processing line: ~~
+** Processing line: ~~
+** Processing line: ~*** Teentiny - license.txt~
+- H3 detected.
+- Determining if line is a header.
+- Line contains ~*** ~... gsub-ing empty string
+- Formatting line: ~Teentiny - 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~
+- 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: ~ Copyright 2019 DragonRuby LLC~
+** Processing line: ~~
+** Processing line: ~ MIT License~
+** Processing line: ~~
+** 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:~
+** Processing line: ~~
+** Processing line: ~ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.~
+** Processing line: ~~
+** 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.~
+** Processing line: ~~
+** Processing line: ~#+end_src~
+- PRE end detected.
+** Processing line: ~~
+** Processing line: ~~
** Processing line: ~** OSS~
- H2 detected.
- Determining if line is a header.
@@ -230244,6 +232037,23 @@ Follows is a source code listing for all files that have been open sourced. This
** Processing line: ~ def autocomplete_methods~
** Processing line: ~ [:inputs, :outputs, :gtk, :state, :geometry, :audio, :grid, :layout, :fn]~
** Processing line: ~ end~
+** Processing line: ~~
+** Processing line: ~ def method_missing name, *args, &block~
+** Processing line: ~ if (args.length <= 1) && (@state.as_hash.key? name)~
+** Processing line: ~ raise <<-S~
+** Processing line: ~ * ERROR - :#{name} method missing on ~#{self.class.name}~.~
+** Processing line: ~ The method~
+** Processing line: ~ :#{name}~
+** Processing line: ~ with args~
+** Processing line: ~ #{args}~
+** Processing line: ~ doesn't exist on #{inspect}.~
+** Processing line: ~ ** POSSIBLE SOLUTION - ~args.state.#{name}~ exists.~
+** Processing line: ~ Did you forget ~.state~ before ~.#{name}~?~
+** Processing line: ~ S~
+** Processing line: ~ end~
+** Processing line: ~~
+** Processing line: ~ super~
+** Processing line: ~ end~
** Processing line: ~ end~
** Processing line: ~ end~
** Processing line: ~~
@@ -230508,6 +232318,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: ~ # ./dragon/attr_sprite.rb~
+** Processing line: ~ # coding: utf-8~
** Processing line: ~ # Copyright 2019 DragonRuby LLC~
** Processing line: ~ # MIT License~
** Processing line: ~ # attr_sprite.rb has been released under MIT (*only this file*).~
@@ -230586,6 +232397,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: ~ # ./dragon/console.rb~
+** Processing line: ~ # coding: utf-8~
** Processing line: ~ # Copyright 2019 DragonRuby LLC~
** Processing line: ~ # MIT License~
** Processing line: ~ # console.rb has been released under MIT (*only this file*).~
@@ -231021,6 +232833,7 @@ Follows is a source code listing for all files that have been open sourced. This
** Processing line: ~ if console_toggle_key_down? args~
** Processing line: ~ args.inputs.text.clear~
** Processing line: ~ toggle~
+** Processing line: ~ args.inputs.keyboard.clear if !@visible~
** Processing line: ~ end~
** Processing line: ~~
** Processing line: ~ return unless visible?~
@@ -231032,7 +232845,16 @@ Follows is a source code listing for all files that have been open sourced. This
** Processing line: ~ @log_offset = 0 if @log_offset < 0~
** Processing line: ~~
** Processing line: ~ if args.inputs.keyboard.key_down.enter~
-** Processing line: ~ eval_the_set_command~
+** Processing line: ~ if slide_progress > 0.5~
+** Processing line: ~ # in the event of an exception, the console window pops up~
+** Processing line: ~ # and is pre-filled with $gtk.reset.~
+** Processing line: ~ # there is an annoying scenario where the exception could be thrown~
+** Processing line: ~ # by pressing enter (while playing the game). if you press enter again~
+** Processing line: ~ # quickly, then the game is reset which closes the console.~
+** Processing line: ~ # so enter in the console is only evaluated if the slide_progress~
+** Processing line: ~ # is atleast half way down the page.~
+** Processing line: ~ eval_the_set_command~
+** Processing line: ~ end~
** Processing line: ~ elsif args.inputs.keyboard.key_down.v~
** Processing line: ~ if args.inputs.keyboard.key_down.control || args.inputs.keyboard.key_down.meta~
** Processing line: ~ prompt << $gtk.ffi_misc.getclipboard~
@@ -231416,6 +233238,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: ~ # ./dragon/console_color.rb~
+** Processing line: ~ # coding: utf-8~
** Processing line: ~ # Copyright 2019 DragonRuby LLC~
** Processing line: ~ # MIT License~
** Processing line: ~ # console_color.rb has been released under MIT (*only this file*).~
@@ -231471,6 +233294,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: ~ # ./dragon/console_font_style.rb~
+** Processing line: ~ # coding: utf-8~
** Processing line: ~ # Copyright 2019 DragonRuby LLC~
** Processing line: ~ # MIT License~
** Processing line: ~ # console_font_style.rb has been released under MIT (*only this file*).~
@@ -231532,6 +233356,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: ~ # ./dragon/console_menu.rb~
+** Processing line: ~ # coding: utf-8~
** Processing line: ~ # Copyright 2019 DragonRuby LLC~
** Processing line: ~ # MIT License~
** Processing line: ~ # console_menu.rb has been released under MIT (*only this file*).~
@@ -231713,6 +233538,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: ~ # ./dragon/console_prompt.rb~
+** Processing line: ~ # coding: utf-8~
** Processing line: ~ # Copyright 2019 DragonRuby LLC~
** Processing line: ~ # MIT License~
** Processing line: ~ # console_prompt.rb has been released under MIT (*only this file*).~
@@ -234510,11 +236336,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: ~ # ./dragon/ios_wizard.rb~
-** Processing line: ~ # Contributors outside of DragonRuby who also hold Copyright: Michał Dudziński~
+** Processing line: ~ # coding: utf-8~
** Processing line: ~ # Copyright 2019 DragonRuby LLC~
** Processing line: ~ # MIT License~
** Processing line: ~ # ios_wizard.rb has been released under MIT (*only this file*).~
** Processing line: ~~
+** Processing line: ~ # Contributors outside of DragonRuby who also hold Copyright: Michał Dudziński~
+** Processing line: ~~
** Processing line: ~ class IOSWizard < Wizard~
** Processing line: ~ def initialize~
** Processing line: ~ @doctor_executed_at = 0~
@@ -235638,6 +237466,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: ~ # ./dragon/itch_wizard.rb~
+** Processing line: ~ # coding: utf-8~
** Processing line: ~ # Copyright 2019 DragonRuby LLC~
** Processing line: ~ # MIT License~
** Processing line: ~ # itch_wizard.rb has been released under MIT (*only this file*).~
@@ -235915,6 +237744,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: ~ # ./dragon/layout.rb~
+** Processing line: ~ # coding: utf-8~
** Processing line: ~ # Copyright 2019 DragonRuby LLC~
** Processing line: ~ # MIT License~
** Processing line: ~ # layout.rb has been released under MIT (*only this file*).~
@@ -236868,11 +238698,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: ~ # ./dragon/metadata.rb~
-** Processing line: ~ # Contributors outside of DragonRuby who also hold Copyright: Michał Dudziński~
+** Processing line: ~ # coding: utf-8~
** Processing line: ~ # Copyright 2021 DragonRuby LLC~
** Processing line: ~ # MIT License~
** Processing line: ~ # metadata.rb has been released under MIT (*only this file*).~
** Processing line: ~~
+** Processing line: ~ # Contributors outside of DragonRuby who also hold Copyright: Michał Dudziński~
+** Processing line: ~~
** Processing line: ~ module Metadata~
** Processing line: ~ def metadata_file_path~
** Processing line: ~ "metadata/game_metadata.txt"~
@@ -237983,6 +239815,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: ~ # ./dragon/runtime/autocomplete.rb~
+** Processing line: ~ # coding: utf-8~
** Processing line: ~ # Copyright 2019 DragonRuby LLC~
** Processing line: ~ # MIT License~
** Processing line: ~ # autocomplete.rb has been released under MIT (*only this file*).~
@@ -238154,6 +239987,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: ~ # ./dragon/runtime/benchmark.rb~
+** Processing line: ~ # coding: utf-8~
** Processing line: ~ # Copyright 2019 DragonRuby LLC~
** Processing line: ~ # MIT License~
** Processing line: ~ # benchmark.rb has been released under MIT (*only this file*).~
@@ -238286,6 +240120,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: ~ # ./dragon/runtime/draw.rb~
+** Processing line: ~ # coding: utf-8~
** Processing line: ~ # Copyright 2019 DragonRuby LLC~
** Processing line: ~ # MIT License~
** Processing line: ~ # draw.rb has been released under MIT (*only this file*).~
@@ -238466,6 +240301,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: ~ # ./dragon/runtime/framerate.rb~
+** Processing line: ~ # coding: utf-8~
** Processing line: ~ # Copyright 2019 DragonRuby LLC~
** Processing line: ~ # MIT License~
** Processing line: ~ # framerate.rb has been released under MIT (*only this file*).~
@@ -238502,12 +240338,7 @@ Follows is a source code listing for all files that have been open sourced. This
** Processing line: ~ if framerate_below_threshold?~
** Processing line: ~ @last_framerate = current_framerate~
** Processing line: ~ if [email protected]?~
-** Processing line: ~ if !@framerate_important_notification_happened~
-** Processing line: ~ log_important framerate_warning_message~
-** Processing line: ~ else~
-** Processing line: ~ log framerate_warning_message~
-** Processing line: ~ end~
-** Processing line: ~ @framerate_important_notification_happened = true~
+** Processing line: ~ log framerate_warning_message~
** Processing line: ~ end~
** Processing line: ~ end~
** Processing line: ~~
@@ -238570,6 +240401,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: ~ # ./dragon/runtime/framerate_diagnostics.rb~
+** Processing line: ~ # coding: utf-8~
** Processing line: ~ # Copyright 2019 DragonRuby LLC~
** Processing line: ~ # MIT License~
** Processing line: ~ # framerate_diagnostics.rb has been released under MIT (*only this file*).~
@@ -239459,6 +241291,104 @@ Follows is a source code listing for all files that have been open sourced. This
- PRE end detected.
** Processing line: ~~
** Processing line: ~~
+** Processing line: ~*** tweetcart.rb~
+- H3 detected.
+- Determining if line is a header.
+- Line contains ~*** ~... gsub-ing empty string
+- Formatting line: ~tweetcart.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: ~tweetcart.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/tweetcart.rb~
+** Processing line: ~ # coding: utf-8~
+** Processing line: ~ # Copyright 2019 DragonRuby LLC~
+** Processing line: ~ # MIT License~
+** Processing line: ~ # tweetcart.rb has been released under MIT (*only this file*).~
+** Processing line: ~~
+** Processing line: ~ def $top_level.TICK &block~
+** Processing line: ~ $top_level.define_method(:tick) do |args|~
+** Processing line: ~ args.outputs[:scene].w = 160~
+** Processing line: ~ args.outputs[:scene].h = 90~
+** Processing line: ~ args.outputs[:scene].background_color = [0, 0, 0, 0]~
+** Processing line: ~ block.call args~
+** Processing line: ~ args.outputs.sprites << { x: 0, y: 0, w: 1280, h: 720, path: :scene }~
+** Processing line: ~ end~
+** Processing line: ~~
+** Processing line: ~ def $top_level.bg! *rgb~
+** Processing line: ~ r,g,b = rgb~
+** Processing line: ~ r ||= 255~
+** Processing line: ~ g ||= r~
+** Processing line: ~ b ||= g~
+** Processing line: ~ $args.outputs.background_color = [r, g, b]~
+** Processing line: ~ end~
+** Processing line: ~~
+** Processing line: ~ def $top_level.slds~
+** Processing line: ~ $args.outputs[:scene].sprites~
+** Processing line: ~ end~
+** Processing line: ~~
+** Processing line: ~ def $top_level.slds! *os~
+** Processing line: ~ if (os.first.is_a? Numeric)~
+** Processing line: ~ sld! *os~
+** Processing line: ~ else~
+** Processing line: ~ os.each { |o| sld! *o }~
+** Processing line: ~ end~
+** Processing line: ~ end~
+** Processing line: ~~
+** Processing line: ~ def $top_level.sld! *params~
+** Processing line: ~ x, y, w, h, r, g, b, a = nil~
+** Processing line: ~ if params.length == 2~
+** Processing line: ~ x, y = params~
+** Processing line: ~ elsif params.length == 3 && (params.last.is_a? Array)~
+** Processing line: ~ x = params[0]~
+** Processing line: ~ y = params[1]~
+** Processing line: ~ r, g, b, a = params[2]~
+** Processing line: ~ r ||= 255~
+** Processing line: ~ g ||= r~
+** Processing line: ~ b ||= g~
+** Processing line: ~ a ||= 255~
+** Processing line: ~ elsif params.length == 4~
+** Processing line: ~ x, y, w, h = params~
+** Processing line: ~ elsif params.length == 5 && (params.last.is_a? Array)~
+** Processing line: ~ x = params[0]~
+** Processing line: ~ y = params[1]~
+** Processing line: ~ w = params[2]~
+** Processing line: ~ h = params[3]~
+** Processing line: ~ r,g,b,a = params[4]~
+** Processing line: ~ r ||= 255~
+** Processing line: ~ g ||= r~
+** Processing line: ~ b ||= g~
+** Processing line: ~ a ||= 255~
+** Processing line: ~ elsif params.length >= 7~
+** Processing line: ~ x, y, w, h, r, g, b = params~
+** Processing line: ~ else~
+** Processing line: ~ raise "I don't know how to render #{params} with reasonable defaults."~
+** Processing line: ~ end~
+** Processing line: ~~
+** Processing line: ~ w ||= 1~
+** Processing line: ~ h ||= 1~
+** Processing line: ~ r ||= 255~
+** Processing line: ~ g ||= 255~
+** Processing line: ~ b ||= 255~
+** Processing line: ~ a ||= 255~
+** Processing line: ~~
+** Processing line: ~ slds << { x: x, y: y,~
+** Processing line: ~ w: w, h: h,~
+** Processing line: ~ r: r, g: g, b: b, a: a,~
+** Processing line: ~ path: :pixel }~
+** Processing line: ~ end~
+** Processing line: ~ end~
+** Processing line: ~~
+** Processing line: ~#+end_src~
+- PRE end detected.
+** Processing line: ~~
+** Processing line: ~~
** Processing line: ~*** wizards.rb~
- H3 detected.
- Determining if line is a header.
@@ -239475,6 +241405,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: ~ # ./dragon/wizards.rb~
+** Processing line: ~ # coding: utf-8~
** Processing line: ~ # Copyright 2019 DragonRuby LLC~
** Processing line: ~ # MIT License~
** Processing line: ~ # wizards.rb has been released under MIT (*only this file*).~
diff --git a/dragon/args.rb b/dragon/args.rb
index 9cf6e33..5bb0ccf 100644
--- a/dragon/args.rb
+++ b/dragon/args.rb
@@ -200,5 +200,22 @@ 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
diff --git a/dragon/console.rb b/dragon/console.rb
index b3a2c2a..34183ae 100644
--- a/dragon/console.rb
+++ b/dragon/console.rb
@@ -434,6 +434,7 @@ S
if console_toggle_key_down? args
args.inputs.text.clear
toggle
+ args.inputs.keyboard.clear if !@visible
end
return unless visible?
@@ -445,7 +446,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
diff --git a/dragon/framerate.rb b/dragon/framerate.rb
index a9504a6..ff2f1c5 100644
--- a/dragon/framerate.rb
+++ b/dragon/framerate.rb
@@ -35,12 +35,7 @@ module GTK
if framerate_below_threshold?
@last_framerate = current_framerate
- if !@framerate_important_notification_happened
- log_important framerate_warning_message
- else
- log framerate_warning_message
- end
- @framerate_important_notification_happened = true
+ log framerate_warning_message
end
end
diff --git a/dragon/recording.rb b/dragon/recording.rb
new file mode 100644
index 0000000..72d8da9
--- /dev/null
+++ b/dragon/recording.rb
@@ -0,0 +1,260 @@
+# 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
diff --git a/dragon/tweetcart.rb b/dragon/tweetcart.rb
new file mode 100644
index 0000000..9e278b3
--- /dev/null
+++ b/dragon/tweetcart.rb
@@ -0,0 +1,102 @@
+# 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
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 4f5b483..ae447fd 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
@@ -112,7 +112,7 @@ class Game
def calc_below
return unless player.dy <= 0
- tiles_below = find_tiles { |t| t.rect.top <= player.y }
+ tiles_below = find_tiles { |t| t.rect.top <= player.prev_rect.y }
collision = find_colliding_tile tiles_below, (player.rect.merge y: player.next_rect.y)
return unless collision
if collision.neighbors.b == :none && player.jumped_down_at.elapsed_time < 10
@@ -143,7 +143,7 @@ class Game
def calc_above
return unless player.dy > 0
- tiles_above = find_tiles { |t| t.rect.y >= player.y }
+ tiles_above = find_tiles { |t| t.rect.y >= player.prev_rect.y }
collision = find_colliding_tile tiles_above, (player.rect.merge y: player.next_rect.y)
return unless collision
return if collision.neighbors.t == :none
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/app/block.rb b/samples/04_physics_and_collisions/08_bouncing_on_collision/app/block.rb
index fa2f3a5..ca0cb3a 100644
--- a/samples/04_physics_and_collisions/08_bouncing_on_collision/app/block.rb
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/app/block.rb
@@ -1,22 +1,24 @@
-class Block
+DEGREES_TO_RADIANS = Math::PI / 180
+
+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.to_radians)
- vertical_offset = block_size * Math.sin(rotation.to_radians)
+ horizontal_offset = (3 * block_size) * Math.cos(rotation * DEGREES_TO_RADIANS)
+ vertical_offset = block_size * Math.sin(rotation * DEGREES_TO_RADIANS)
if rotation >= 0
theta = 90 - rotation
#The line doesn't visually line up exactly with the edge of the sprite, so artificially move it a bit
modifier = 5
- x_offset = modifier * Math.cos(theta.to_radians)
- y_offset = modifier * Math.sin(theta.to_radians)
+ x_offset = modifier * Math.cos(theta * DEGREES_TO_RADIANS)
+ y_offset = modifier * Math.sin(theta * DEGREES_TO_RADIANS)
@x1 = @x - x_offset
@y1 = @y + y_offset
@x2 = @x1 + horizontal_offset
@@ -25,8 +27,8 @@ class Block
@imaginary_line = [ @x1, @y1, @x2, @y2 ]
else
theta = 90 + rotation
- x_offset = @block_size * Math.cos(theta.to_radians)
- y_offset = @block_size * Math.sin(theta.to_radians)
+ x_offset = @block_size * Math.cos(theta * DEGREES_TO_RADIANS)
+ y_offset = @block_size * Math.sin(theta * DEGREES_TO_RADIANS)
@x1 = @x + x_offset
@y1 = @y + y_offset + 19
@x2 = @x1 + horizontal_offset
@@ -34,7 +36,7 @@ class Block
@imaginary_line = [ @x1, @y1, @x2, @y2 ]
end
-
+
end
def draw args
@@ -78,7 +80,7 @@ class Block
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)
@@ -86,7 +88,7 @@ class Block
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)
@@ -94,7 +96,7 @@ class Block
collision = true
end
end
-
+
return collision
end
@@ -103,8 +105,8 @@ class Block
slope = (@y2 - @y1) / (@x2 - @x1)
#Create a unit vector and tilt it (@rotation) number of degrees
- x = -Math.cos(@rotation.to_radians)
- y = Math.sin(@rotation.to_radians)
+ x = -Math.cos(@rotation * DEGREES_TO_RADIANS)
+ y = Math.sin(@rotation * DEGREES_TO_RADIANS)
#Find the vector that is perpendicular to the slope
perpVect = { x: x, y: y }
@@ -115,10 +117,10 @@ class Block
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.to_radians) - theta_ball + (@rotation.to_radians)
+ theta_repel = (180 * DEGREES_TO_RADIANS) - theta_ball + (@rotation * DEGREES_TO_RADIANS)
fbx = velocityMag * Math.cos(theta_ball) #the x component of the ball's velocity
fby = velocityMag * Math.sin(theta_ball) #the y component of the ball's velocity
@@ -137,16 +139,16 @@ class Block
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
end
#Add the sine component of gravity back in (X component)
- gravity_x = 4 * Math.sin(@rotation.to_radians)
+ gravity_x = 4 * Math.sin(@rotation * DEGREES_TO_RADIANS)
xnew += gravity_x
-
+
args.state.ball.velocity.x = -xnew
args.state.ball.velocity.y = -ynew
diff --git a/samples/07_advanced_rendering/11_render_target_noclear/app/main.rb b/samples/07_advanced_rendering/11_render_target_noclear/app/main.rb
new file mode 100644
index 0000000..9e5dffd
--- /dev/null
+++ b/samples/07_advanced_rendering/11_render_target_noclear/app/main.rb
@@ -0,0 +1,47 @@
+def tick args
+ args.state.x ||= 500
+ args.state.y ||= 350
+ args.state.xinc ||= 7
+ args.state.yinc ||= 7
+ args.state.bgcolor ||= 1
+ args.state.bginc ||= 1
+
+ # clear the render target on the first tick, and then never again. Draw
+ # another box to it every tick, accumulating over time.
+ clear_target = (args.state.tick_count == 0) || (args.inputs.keyboard.key_down.space)
+ args.render_target(:accumulation).background_color = [ 0, 0, 0, 0 ];
+ args.render_target(:accumulation).clear_before_render = clear_target
+ args.render_target(:accumulation).solids << [args.state.x, args.state.y, 25, 25, 255, 0, 0, 255];
+ args.state.x += args.state.xinc
+ args.state.y += args.state.yinc
+ args.state.bgcolor += args.state.bginc
+
+ # animation upkeep...change where we draw the next box and what color the
+ # window background will be.
+ if args.state.xinc > 0 && args.state.x >= 1280
+ args.state.xinc = -7
+ elsif args.state.xinc < 0 && args.state.x < 0
+ args.state.xinc = 7
+ end
+
+ if args.state.yinc > 0 && args.state.y >= 720
+ args.state.yinc = -7
+ elsif args.state.yinc < 0 && args.state.y < 0
+ args.state.yinc = 7
+ end
+
+ if args.state.bginc > 0 && args.state.bgcolor >= 255
+ args.state.bginc = -1
+ elsif args.state.bginc < 0 && args.state.bgcolor <= 0
+ args.state.bginc = 1
+ end
+
+ # clear the screen to a shade of blue and draw the render target, which
+ # is not clearing every frame, on top of it. Note that you can NOT opt to
+ # skip clearing the screen, only render targets. The screen clears every
+ # frame; double-buffering would prevent correct updates between frames.
+ args.outputs.background_color = [ 0, 0, args.state.bgcolor, 255 ]
+ args.outputs.sprites << [ 0, 0, 1280, 720, :accumulation ]
+end
+
+$gtk.reset
diff --git a/samples/07_advanced_rendering/11_render_target_noclear/metadata/game_metadata.txt b/samples/07_advanced_rendering/11_render_target_noclear/metadata/game_metadata.txt
new file mode 100644
index 0000000..3d0bd06
--- /dev/null
+++ b/samples/07_advanced_rendering/11_render_target_noclear/metadata/game_metadata.txt
@@ -0,0 +1,5 @@
+devid=dragonruby
+devtitle=DragonRuby LLC
+gameid=render_target_noclear
+gametitle=Render targets that don't clear every frame.
+version=1.0
diff --git a/samples/10_advanced_debugging/03_unit_tests/serialize_deserialize_tests.rb b/samples/10_advanced_debugging/03_unit_tests/serialize_deserialize_tests.rb
index 8505bdf..12c08f6 100644
--- a/samples/10_advanced_debugging/03_unit_tests/serialize_deserialize_tests.rb
+++ b/samples/10_advanced_debugging/03_unit_tests/serialize_deserialize_tests.rb
@@ -2,12 +2,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
@@ -56,7 +56,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
@@ -113,3 +113,15 @@ def test_by_reference_state_strict_entities args, assert
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
diff --git a/samples/12_c_extensions/README.md b/samples/12_c_extensions/README.md
index 8950e53..aef3864 100644
--- a/samples/12_c_extensions/README.md
+++ b/samples/12_c_extensions/README.md
@@ -350,6 +350,34 @@ dragonruby-bind --ffi-module=CoolStuff bridge.c
Then one can use `include FFI::CoolStuff` instead.
+### Type checks
+
+C extensions expect the right types in the right place!
+
+Given the following C code:
+
+```c
+void take_int(int x) { ... }
+void take_struct(struct S) { ... }
+```
+
+the next calls from the Ruby side
+
+```ruby
+take_int(15.0)
+take_struct(42)
+```
+
+may not work as you would expect.
+In the case of `take_int`, you'll likely see some garbage instead of "expected" `15`.
+The call to `take_struct` will likely crash.
+
+To prevent this from happening, `dragonruby-bind` emits code that does type checking:
+if you use the wrong types DragonRuby will throw an exception.
+
+If the type checking takes CPU cycles out of your game (or if you feel brave) you can
+disable type checks via `--no-typecheck` CLI argument when emitting C bindings.
+
### Pitfalls
There is no so-called marshalling when it comes to structs. When you read or
diff --git a/samples/99_genre_teenytiny/app/main.rb b/samples/99_genre_teenytiny/app/main.rb
new file mode 100644
index 0000000..a542a93
--- /dev/null
+++ b/samples/99_genre_teenytiny/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/license.txt b/samples/99_genre_teenytiny/license.txt
new file mode 100644
index 0000000..100dcec
--- /dev/null
+++ b/samples/99_genre_teenytiny/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/metadata/game_metadata.txt b/samples/99_genre_teenytiny/metadata/game_metadata.txt
new file mode 100644
index 0000000..1b03500
--- /dev/null
+++ b/samples/99_genre_teenytiny/metadata/game_metadata.txt
@@ -0,0 +1,6 @@
+#devid=myname
+#devtitle=My Name
+#gameid=mygame
+#gametitle=My Game
+#version=0.1
+#icon=metadata/icon.png
diff --git a/samples/99_genre_teenytiny/metadata/icon.png b/samples/99_genre_teenytiny/metadata/icon.png
new file mode 100644
index 0000000..e20e8c2
--- /dev/null
+++ b/samples/99_genre_teenytiny/metadata/icon.png
Binary files differ
diff --git a/samples/99_genre_teenytiny/sprites/square-green.png b/samples/99_genre_teenytiny/sprites/square-green.png
new file mode 100644
index 0000000..5ef7f75
--- /dev/null
+++ b/samples/99_genre_teenytiny/sprites/square-green.png
Binary files differ
diff --git a/samples/99_genre_teenytiny/sprites/square-red.png b/samples/99_genre_teenytiny/sprites/square-red.png
new file mode 100644
index 0000000..3ed5f13
--- /dev/null
+++ b/samples/99_genre_teenytiny/sprites/square-red.png
Binary files differ